SpringBean的初始化流程
初始化流程
当我们启动Spring容器后,会先通过AbstractApplicationContext#refresh方法,调用BeanFactoryPostProcess方法,可以在bean初始化前,修改context中的BeanDefinition,但是因为此时Bean还没有初始化,所以并不会修改bean实例。然后会开始初始化非懒加载的bean。
- 通过
InstantiationAwareBeanPostProcessor
在实例化bean之前做前置处理,这样做的目的是可以给应用代码一个返回代理bean的机会(Spring AOP在这里实现) - 通过反射实例化该bean(有多种情况,分为有参数,无参数构造器,以及是否有Autowired注解)
- 填充Bean的field实例(此时可能会有循环依赖问题,涉及到循环初始化)
- 调用初始化方法之前,先调用
BeanPostProcessor#postProcessBeforeInitialization
方法(各种Aware的织入就在此处执行) - 执行该bean的初始化方法,如
InitializingBean#afterProperties
方法,或者自定义的init-method方法 - 调用
BeanPostProcessor#postProcessAfterInitialization
执行初始化的后置处理方法 - 如果该bean有相关的销毁方法,则将对应的销毁方法注册进容器中,当销毁bean的时候会进行回调处理