zoukankan      html  css  js  c++  java
  • 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读


    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说,
    DefaultListableBeanFactory 是整个spring ioc的始祖,研究透它的前生今世对我们理解spring ioc的概念有着重要的作用。

    1. DefaultListableBeanFactory的作用:

    默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definition对象,是一个成熟的bean factroy。

    最典型的应用是:在访问bean前,先注册所有的definition(可能从bean definition配置文件中)。使用预先建立的bean定义元数据对象,从本地的bean definition表中查询bean definition因而将不会花费太多成本。

    DefaultListableBeanFactory既可以作为一个单独的beanFactory,也可以作为自定义beanFactory的父类。

    注意:特定格式bean definition的解析器可以自己实现,也可以使用原有的解析器,如:

    PropertiesBeanDefinitionReader和XmLBeanDefinitionReader。

    2. DefaultListableBeanFactory的继承关系

    spring提供一些实用的综合工具类如ClassUtils,ClassUtils提供了对类的实用方法,主要用在框架内部,想要了解更全面的类的工具方法可以参考apache commons lang。

    上述静态方法中返回了javax.inject.Provider的一个实例,那么我们揭开javax.inject.Provider的面纱看看它到底起了什么作用。

    语法:public interface Provider<T>

    提供了一个 T的实例. 通常作为一个依赖注入容器器的父接口. 可以注入任何类型的 T, 当然也可以注入 Provider<T>. 相对于直接注入 T,注入 Provider<T>有如下作用:

    • 检索多个实例.

    • 延迟或者选择性的检索一个实例.

    • 打破循环依赖.

    • 抽象的scope,可以从一个包含scope的更小的scope中检索一个实例。

    3.2 继承自AbstractAutowireCapableBeanFactory的方法:

    AbstractAutowireCapableBeanFactory的作用:

    提供bean的创建 (有construct方法), 属性注值, 绑定 (包括自动绑定)和初始化.

    处理运行时bean引用, 解析管理的集合, 调用初始化方法。

    最主要的子类要实现的模板方法是 AutowireCapableBeanFactory.resolveDependency(DependencyDescriptor, String, Set, TypeConverter), 这个方法用来实现类型的自动绑定.

    在DefaultListableBeanFactory中实现了AbstractAutowireCapableBeanFactory.copyConfigurationFrom

    其中:

    allowBeanDefinitionOverriding定义了是否允许同名的不同bean definition再次进行注册;

    allowEagerClassLoading 定义了是否允许eager类(相对于lazy)的加载,甚至延迟初始化的bean的加载。

    autowireCandidateResolver是一个策略接口,用来决定一个特定的bean definition 是否满足做一个特定依赖的自动绑定的候选项,方法如下所示:

    resolvableDependencies:定义了依赖类型和其对应的自动绑定值的键值对集合。

    AbstractAutowireCapableBeanFactory的copyConfigurationFrom方法:

    其中,instantiationStrategy 为创建bean 实例的策略,默认值:

    private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

    allowCircularReferences 确定是否自动尝试去解析循环引用的bean。

    ignoredDependencyTypes 定义了在依赖检查和自动绑定时要忽略的依赖类型,是一组类对象,例如string,默认为没有。

    ignoredDependencyInterfaces  定义了在依赖检查和自动绑定时要忽略的依赖接口,是一组类对象,默认情况下,只有beanFactory接口被忽略。

    父类AbstractBeanFactory的copyConfigurationFrom的实现如下:

    其中

    customEditors 是自定义的属性编辑器,适用于该beanFactory的所有bean。
    propertyEditorRegistrars属性编辑器的注册器,使用于该beanFactory的所有bean。
    beanPostProcessors 创建bean时应用的beanPostProcessors。
    hasInstantiationAwareBeanPostProcessors 表明是否注册有任何的InstantiationAwareBeanPostProcessors。
    hasDestructionAwareBeanPostProcessors表明是否注册有任何的DestructionAwareBeanPostProcessors
    scopes:域标识符和对应域的键值对集合。

    securityContextProvider 运行SecurityManager时使用的security context。

    3.3 继承自ListableBeanFactory接口的方法
    ListableBeanFactory是beanFactory接口的扩展接口,它可以枚举所有的bean实例,而不是客户端通过名称一个一个的查询得出所有的实例。要预加载所有的bean定义的beanfactory可以实现这个接口来。该 接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等方法;

    3.4 继承自ConfigurableListableBeanFactory接口的方法
    ConfigurableListableBeanFactory 它同时继承了ListableBeanFactory,AutowireCapableBeanFactory和ConfigurableBeanFactory,提供了对bean定义的分析和修改的便利方法,同时也提供了对单例的预实例化。
    3.5 继承自BeanDefinitionRegistry接口的方法
    BeanDefinitionRegistry:Spring配置文件中每一个<bean>节点元素在Spring容器里都通过一个BeanDefinition对象表示,它描述了Bean的配置信息。而BeanDefinition Registry接口提供了向容器手工注册BeanDefinition对象的方法。
    3.6 序列化支持
     private void writeObject(java.io.ObjectOutputStream out)throws IOException
     private void readObject(java.io.ObjectInputStream in)throws IOException, ClassNotFoundException;
     private void readObjectNoData()throws ObjectStreamException;

    4 小结:
    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说,
    DefaultListableBeanFactory 是整个spring ioc的始祖,研究透它的前生今世对我们理解spring ioc的概念有着重要的作用。
    DefaultListableBeanFactory功能的实现是通过实现特定功能的接口来完成。
    AbstractAutowireCapableBeanFactory 实现属性的自动绑定功能。
    ConfigurableListableBeanFactory提供了对bean定义的分析和修改的便利方法,同时也提供了对单例的预实例化。

      ListableBeanFactory提供枚举所有的bean实例,而不是客户端通过名称一个一个的查询得出所有的实例。

    BeanDefinitionRegistry 提供了beanDefinition的管理。
  • 相关阅读:
    jenkins
    k8s 驱逐限制
    jenkins+k8s 实现持续集成
    镜像更新备份
    【工具分享】2020年4月 phpstorm2020.1 for mac
    【排坑】mac安装homebrew会遇到的各种问题解决方案
    记一次C盘扩容
    2018夏季工作台之再设计
    left join后面加上where条件浅析
    编程随想篇(2018夏)
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/10361937.html
Copyright © 2011-2022 走看看