spring bean生命周期

创建Bean的步骤在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactorycreateBean方法中,具体的顺序如下

  1. 实例化,具体使用的BeanUtils.instantiateClass,内部采用的constructor.newInstance方法,关于class.newInstanceconstructor.newInstance的区别,class实例化只能使用默认构造方法,不能使用带参的构造函数。
  2. 检查依赖,填充属性,具体在populateBean方法中,内部使用的是反射的writeMethod.invoke。这里注意,会在这里提前检查InstantiationAwareBeanPostProcessor接口,若是实现该接口会调用其postProcessAfterInstantiationpostProcessPropertyValues方法。
  3. 初始化bean,具体在initializeBean方法中
    1. 首先判断其是否实现了BeanNameAware,BeanFactoryAware等aware,若是实现,调用其set方法。
    2. 判断当前的factory中是否有BeanPostProcessor实现类,若是存在,逐个调用其postProcessBeforeInitialization方法。
    3. 若是PostConstruct标记的方法存在,执行该方法。这里是使用BeanPostProcessor来实现的,具体是在org.springframework.context.annotation.CommonAnnotationBeanPostProcessor。该类在继承InitDestroyAnnotationBeanPostProcessor时使用setInitAnnotationType添加了PostConstruct注解。
    4. 当前Bean若是实现了InitializingBean,调用其afterPropertiesSet方法。
    5. 若是存在init-method,调用其init-method。(有些书例如spring in action提到@PostConstruct标记的方法等效于init-method,但是其实两者是不同的并且两者可以同时存在,且调用顺序不同)。
    6. 判断当前factory是否有BeanPostProcess的实现类,若是存在,逐个调用其postProcessAfterInitialization方法。
  4. 当前bean已经可以使用。
  5. 销毁bean。
    1. 若是存在DestructionAwareBeanPostProcessor的实现类,逐个调用其postProcessBeforeDestruction方法。
    2. 若是存在PreDestroy标记的方法,执行该方法,和@PostConstructor相同,使用InitDestroyAnnotationBeanPostProcessor,该类实现了DestructionAwareBeanPostProcessor的方法。
    3. 若是当前Bean实现了DisposableBean,调用其destroy方法。
    4. 若是存在destroy-method,调用其destroy-method方法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容