Bean生产阶段
一、加载Bean
loadBeanDefinitions
方法用xml、注解扫描等方式找到bean,放入beanDefinitionMap
,然后遍历该集合,并通过createBean
方法来创建bean对象。
二、创建Bean对象
-
通过
createBeanInstance
方法来构造对象。 -
获取构造方法,用反射从bean定义的
beanClass
拿到这个类的构造方法- 如果只有一个构造方法,将直接使用这个构造方法,而不管这个构造方法有没有入参。
- 如果有多个构造方法,优先使用带有
@Autowired
注解的构造方法,如果多个构造方法都加了@Autowired
注解,会报错。 - 如果构造方法都没有
@Autowired
注解,将优先使用无参方法。 - 如果多个方法都是有参的,会报错。
-
准备参数(若使用的是无参构造方法,则无需参数直接构造)
- 在单例池中,根据参数的Class类进行查找。
- 如果这个类有多个实例,则会根据参数名再进行匹配。
- 如果没有找到,会报错。
-
通过反射进行bean的构造(实例化)
- 通过
populateBean
方法对bean的属性进行赋值填充(通过为@Autowired
注解的这些变量),通过三级缓存机制进行填充,也就是依赖注入。
- 先通过
initializeBean
方法对实例进行初始化。 - 再通过
invokeAwareMethods
方法,实现各种Aware接口(BeanNameAware
、BeanFactoryAware
、ApplicationContextAware
)的Bean设置BeanName
、BeanFactory
、ApplicationContext
容器信息(Aware接口代表"信息感知"接口)。 - 然后通过
invokeInitMethods
方法执行Bean的初始化方法,这个方法是通过实现InitiallizingBean
接口而实现的afterPropertiesSet方法("Bean填充属性后"执行)。 - 继续执行程序员在Bean上自定义的
initMethod
方法。 - 对
BeanPostProcessors
进行处理,通过applyBeanPostProcessorsBeforeInitialization
和applyBeanPostProcessorsAfterInitialization
分别在初始化之前和之后处理各种Bean的后置处理器,包括"负责AOP处理"的AnnotationAwareAspectJAutoProxyCreator
、负责"构造后@PostConstruct
和销毁前@PreDestroy
处理"的InitDestoryAnnotationBeanPostProcessor
等系统级处理器以及程序员通过实现BeanPostProcessor
接口的自定义处理器。由于处理器过多,可以通过实现PriorityOrdered
接口来指定顺序进行逐一处理。
- 通过
registerDisposableBean
方法将实现销毁接口DisposableBean
的Bean进行注册,这样在销毁时就可以执行destroy方法了(registerDisposableBean
注册可销毁的Bean对象)。
三、添加单例Bean对象(add Singleton)
- 将这些完整的Bean对对象通过
addSingleton
方法放入单例池singletonObjects
中就可以被获取和使用了。
![Bean生产阶段](https://i-blog.csdnimg.cn/blog_migrate/e0e586ee1bd0622ddc0647cd0bdfa01d.png)
Bean使用阶段
该阶段可正常使用bean。
Bean销毁阶段
- 在销毁之前要先执行"销毁前处理器"
postProcessBeforeDestruction
,这里会执行Bean中添加了@PreDestroy注解的方法。 - 然后通过
destroyBeans
方法逐一销毁所有的Bean。 - 通过"客户销毁方法"
invokeCustomDestoryMethod
来执行程序员在Bean上自定义的destroyMethod方法。
![Bean销毁阶段](https://i-blog.csdnimg.cn/blog_migrate/b8875c1667c2e1af688571981daf3739.png)