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的管理。
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/10361937.html
Copyright © 2011-2022 走看看