前面我们把Spring是如何扫描得到BeanDefinition的整个过程应该算是讲清楚了,如果对这个过程还有不了解的,不妨多看几遍,如果还是有问题,欢迎在评论区和笔者交流。从这章节开始我们开始分析下bean的生命周期的底层原理。
在开始生命周期的底层原理分析之前,有必要先把BeanFactory的整个继承结构讲下。我们先来看看
AnnotationConfigApplicationContext的继承结构,如下图:
从上图可以看出,
AnnotationConfigApplicationContext是GenericApplicationContext的子类,所以在构造AnnotationConfigApplicationContext之前会首先执行GenericApplicationContext的默认构造函数:
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
GenericApplicationContext的默认构造函数中,创建了
DefaultListableBeanFactory的实例对象,这个就是咱们的核心BeanFactory类,来看看它的继承结构图:
我们知道每个接口就是定义具体的能力,而这里
DefaultListableBeanFactory则是BeanFactory能力的集大成者,我们来细数下每个接口的具体能力:
SingletonBeanRegistry
很明显,该接口定义了单例bean实例注册的相关操作。而
DefaultSingletonBeanRegistry则是该接口的默认实现类,FactoryBeanRegistrySupport则是在支持FactoryBean实例注册的实现类,它除了继承了DefaultSingletonBeanRegistry的能力,还专门对FactoryBean这种特殊Bean进行了处理。
BeanFactory
BeanFactory是Bean工厂的跟接口,用于访问SpringBean容器的根接口。其子接口HierarchicalBeanFactory定义了允许以可配置方式设置父级的bean工厂的相应方法,看它定义的方法:
BeanFactory getParentBeanFactory();
就知道它是提供父子BeanFactory能力的,而ListableBeanFactory则是一个主要的BeanFactory接口,它定义了获取Bean的方式。
ConfigurableListableBeanFactory则是继承了这两者的能力。
ConfigurableBeanFactory则是HierarchicalBeanFactory和SingletonBeanRegistry的子接口,当然拥继承了两者的能力;
AbstractBeanFactory是
FactoryBeanRegistrySupport和ConfigurableBeanFactory接口的实现类,不过它是抽象类,它里面定义了很多具体的后去bean的实现方式,如getBean。
AbstractAutowireCapableBeanFactory继承了AutowireCapableBeanFactory,他们定义了依赖注入的方式,如下:
int AUTOWIRE_NO = 0; //默认值,未激活Autowiring,需要手动指定依赖注入对象\
int AUTOWIRE_BY_NAME = 1;//根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性
int AUTOWIRE_BY_TYPE = 2;//根据被注入属性的类型作为Bean类型进行依赖查找,并将对象设置到该属性
int AUTOWIRE_CONSTRUCTOR = 3;//特殊的byType,用于构造器参数
BeanDefinitionRegistory
这个则是注册BeanDefinition的接口,这块也是我们在前面几个章节的扫描原理中已经介绍。
而
DefaultListableBeanFactory则是继承了AbstractAutowireCapableBeanFactory,并实现了ConfigurableListableBeanFactory、BeanDefinitionRegistry接口,所以我们说DefaultListableBeanFactory是Bean工厂的集大成者。