spring-beans重点类说明

1.BeanDefinition:

BeanDefinition描述一个bean实例,这个bean实例包含了属性值,构造函数的参数值,以及由具体实现提供
额进一步信息,主要目的是允许像 PropertyPlaceholderConfigurer 这样的 BeanFactoryPostProcessor来内省和
改变属性值以及其他bean的元数据
实现类有:ChildBeanDefinition, GenericBeanDefinition, RootBeanDefinition

ChildBeanDefinition

ChildBeanDefinition没有直接实现BeanDefinition,而是通过继承AbstractBeanDefinition来间接实现的,AbstractBeanDefinition是实现了BeanDefinition接口
ChildBeanDefinition在BeanDefinition的基础上引入了属性parentName来指定父类名称,正如其名,ChildBeanDefinition让两个BeanDefinition产生了关联

GenericBeanDefinition

从spring 2.5 开始引入GenericBeanDefinition,跟ChildBeanDefinition一样,GenericBeanDefinition也引入了parentName来指定自己的父类
GenericBeanDefinition可以有效的替代ChildBeanDefinition的绝大分部使用场合
GenericBeanDefinition是一站式的标准bean definition,除了具有指定类、可选的构造参数值和属性参数这些其它bean definition一样的特性外,它还具有通过parenetName属性来灵活设置parent bean definition。
通常, GenericBeanDefinition用来注册用户可见的bean definition(可见的bean definition意味着可以在该类bean definition上定义post-processor来对bean进行操作,甚至为配置parent name做扩展准备)。RootBeanDefinition / ChildBeanDefinition用来预定义具有parent/child关系的bean definition

RootBeanDefinition

RootBeanDefinition是一个可以合并的bean definition,在spring beanFactory运行期间,可以返回一个特定的bean。RootBeanDefinition可以作为一个重要的通用的bean definition 视图
RootBeanDefinition用来在配置阶段进行注册bean definition
spring 2.5以后,加入了GenericBeanDefinition,支持动态定义父类依赖

2.BeanFactory

功能和名称基本一致,就是创建bean的工厂,主要是用BeanDefinition来生成对应的bean,BeanFactory为bean创建的核心的接口,具体如何创建bean则根据不同的需求来实现该接口,这也为后面的扩展提供了可能


beanFactory及相关实现.png

ListableBeanFactory

表示这些Bean是可列表的;
额外提供了列出所有bean对象的能力

StaticListableBeanFactory

ListableBeanFactory的实现类,实现了getBean方法,只允许注册已经存在的单例实例,不支持prototype和aliases;允许遍历得到BeanFactory保存的bean实体

HierarchicalBeanFactory

表示这些Bean有继承关系;
额外使了 factory 拥有一个 parent factory 的能力, 可以存在层级关系

ConfigurableBeanFactory

ConfigurableBeanFactory加入了BeanPostProcessor、bean的生命周期管理、bean的依赖处理、属性编辑器、类型解析器、beandefinition处理、类加载器、合并其他configuration的api,为扩展提供了更多的可能

AutowireCapableBeanFactory

定义Bean的自动装配规则;
提供了在创建对象时, 通过set方式给 bean 初始化 autowired 或者声明了 dependon 的成员

ConfigurableListableBeanFactory

实现了ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory三个接口,在此三个接口的基础上继续扩展了更多的api,更灵活的去操作bean的创建

DefaultListableBeanFactory:DefaultListableBeanFactory是ConfigurableListableBeanFactory的具体实现,同时也继承了AbstractAutowireCapableBeanFactory,它的最典型应用是在访问bean前,先注册所有的definition(可能从bean definition配置文件中)。使用预先建立的bean定义元数据对象,从本地的bean definition表中查询bean definition因而将不会花费太多成本。DefaultListableBeanFactory既可以作为一个单独的beanFactory,也可以作为自定义beanFactory的父类。在DefaultListableBeanFactory中实现了AbstractAutowireCapableBeanFactory.copyConfigurationFrom,代码如下:

    @Override
    public void copyConfigurationFrom(ConfigurableBeanFactory otherFactory) {
        super.copyConfigurationFrom(otherFactory);
        if (otherFactory instanceof DefaultListableBeanFactory) {
            DefaultListableBeanFactory otherListableFactory = (DefaultListableBeanFactory) otherFactory;
            this.allowBeanDefinitionOverriding = otherListableFactory.allowBeanDefinitionOverriding;
            this.allowEagerClassLoading = otherListableFactory.allowEagerClassLoading;
            this.autowireCandidateResolver = otherListableFactory.autowireCandidateResolver;
            this.resolvableDependencies.putAll(otherListableFactory.resolvableDependencies);
        }
    }

其中:

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

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

autowireCandidateResolver是一个策略接口,用来决定一个特定的bean definition 是否满足做一个特定依赖的自动绑定的候选项。

AbstractAutowireCapableBeanFactory的copyConfigurationFrom方法:

    @Override
    public void copyConfigurationFrom(ConfigurableBeanFactory otherFactory) {
        super.copyConfigurationFrom(otherFactory);
        if (otherFactory instanceof AbstractAutowireCapableBeanFactory) {
            AbstractAutowireCapableBeanFactory otherAutowireFactory =
                    (AbstractAutowireCapableBeanFactory) otherFactory;
            this.instantiationStrategy = otherAutowireFactory.instantiationStrategy;
            this.allowCircularReferences = otherAutowireFactory.allowCircularReferences;
            this.ignoredDependencyTypes.addAll(otherAutowireFactory.ignoredDependencyTypes);
            this.ignoredDependencyInterfaces.addAll(otherAutowireFactory.ignoredDependencyInterfaces);
        }
    }

3.小结

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

BeanDefinitionRegistry 提供了beanDefinition的管理。

BeanDefinition和BeanFactory共同组成了spring的核心=>Bean,spring的一切都源于bean即java的面向对象思想,一切皆对象对应spring的一切皆bean

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容