跳至主要內容

SpringBean的初始化流程

ZnyoungJavaSpring

初始化流程

当我们启动Spring容器后,会先通过AbstractApplicationContext#refresh方法,调用BeanFactoryPostProcess方法,可以在bean初始化前,修改context中的BeanDefinition,但是因为此时Bean还没有初始化,所以并不会修改bean实例。然后会开始初始化非懒加载的bean。

  1. 通过InstantiationAwareBeanPostProcessor在实例化bean之前做前置处理,这样做的目的是可以给应用代码一个返回代理bean的机会(Spring AOP在这里实现
  2. 通过反射实例化该bean(有多种情况,分为有参数,无参数构造器,以及是否有Autowired注解)
  3. 填充Bean的field实例(此时可能会有循环依赖问题,涉及到循环初始化)
  4. 调用初始化方法之前,先调用BeanPostProcessor#postProcessBeforeInitialization方法(各种Aware的织入就在此处执行)
  5. 执行该bean的初始化方法,如InitializingBean#afterProperties方法,或者自定义的init-method方法
  6. 调用BeanPostProcessor#postProcessAfterInitialization执行初始化的后置处理方法
  7. 如果该bean有相关的销毁方法,则将对应的销毁方法注册进容器中,当销毁bean的时候会进行回调处理
上次编辑于:
贡献者: 麦正阳