美文网首页
spring bean生命周期

spring bean生命周期

作者: Ace_b90f | 来源:发表于2020-05-26 15:14 被阅读0次

创建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方法。

相关文章

网友评论

      本文标题:spring bean生命周期

      本文链接:https://www.haomeiwen.com/subject/ikqvahtx.html