SpringBoot中bean的生命周期

        Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。

  • 1 生命周期

  1. 实例化 Instantiation 
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<em id="__mceDel">      throws BeanCreationException {
 
   BeanWrapper instanceWrapper = null;
   if (instanceWrapper == null) {
       // 实例化阶段
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }
 
   Object exposedObject = bean;
   try {
       // 属性赋值阶段
      populateBean(beanName, mbd, instanceWrapper);
       // 初始化阶段
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }<br><br><span class="hljs-keyword">   try {<br>      //销毁-注册回调接口<br></span>      registerDisposableBeanIfNecessary(beanName, bean, mbd);<br>      }</em>
1
}
  • 2  步骤

 

  1. 实例化:第 1 步,实例化一个 bean 对象;
  2. 属性赋值:第 2 步,为 bean 设置相关属性和依赖;
  3. 初始化:第 3~7 步,步骤较多,其中第 5、6 步为初始化操作,第 3、4 步为在初始化前执行,第 7 步在初始化后执行,该阶段结束,才能被用户使用;
  4. 销毁:第 8~10步,第8步不是真正意义上的销毁(还没使用呢),而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁 bean 时再执行相应的方法。

 

  • 3 步骤

   Aware 接口有:

  1. BeanNameAware:注入当前 bean 对应 beanName;
  2. BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader;
  3. BeanFactoryAware:注入 当前BeanFactory容器 的引用。

   ApplicationContext 类型的容器使用BeanPostProcessor

  1. EnvironmentAware:注入 Enviroment,一般用于获取配置属性;
  2. EmbeddedValueResolverAware:注入 EmbeddedValueResolver(Spring EL解析器),一般用于参数解析;
  3. ApplicationContextAware(ResourceLoader、ApplicationEventPublisherAware、MessageSourceAware):注入 ApplicationContext 容器本身。

   BeanPostProcessor 是 Spring 为修改bean提供的扩展点,其可作用于容器中所有 bean。

  1. 对于标记接口的实现类,进行自定义处理。如ApplicationContextAwareProcessor,为其注入相应依赖;再举个例子,自定义对实现解密接口的类,将对其属性进行解密处理;

  2. 为当前对象提供代理实现。例如 Spring AOP 功能,生成对象的代理类,然后返回。

   InitializingBean 和 init-method
   InitializingBean 和 init-method 是 Spring 为bean的初始化提供的扩展点。
     InitializingBean接口 的定义如下:
       public interface InitializingBean { void afterPropertiesSet() throws Exception; } 
       在 afterPropertiesSet() 方法写初始化逻辑。
       指定 init-method 方法,指定初始化方法。

  • 4 总结

      最后总结下如何记忆 Spring Bean 的生命周期:

    • 首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;
    • 再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
    • 销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。

  转载自文章csdn

   

posted @ 2022-05-08 00:16  lostxxx  阅读(1990)  评论(0)    收藏  举报