1. 程式人生 > >Spring註解開發-全面解析常用註解使用方法之生命周期

Spring註解開發-全面解析常用註解使用方法之生命周期

統一 ota tco conf struct 賦值 組件註冊 功能 pri

本文github位置:https://github.com/WillVi/Spring-Annotation/

往期文章:Spring註解開發-全面解析常用註解使用方法之組件註冊

bean生命周期

? 創建------>初始化------->銷毀。容器統一管理bean的生命周期,我們也可以自定義初始化和銷毀方法;容器在bean進行到當前生命周期的時候來調用我們自定義的初始化和銷毀方法。

流程:

  1. 構造(對象創建)

    • 單實例:在容器啟動的時候創建對象
    • 多實例:在每次獲取的時候創建對象
  2. BeanPostProcessor.postProcessBeforeInitialization

    ? ps:遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,一但返回null,跳出for循環,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization

  3. 初始化: 對象創建完成,並賦值好,調用初始化方法。。。

  4. BeanPostProcessor.postProcessAfterInitialization

  5. 銷毀:

    • 單實例:容器關閉的時候
    • 多實例:容器不會管理這個bean;容器不會調用銷毀方法;

BeanPostProcessor原理

以下下方法依次執行:

populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值

? initializeBean

{

`applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);`初始化前執行

`invokeInitMethods(beanName, wrappedBean, mbd);`執行自定義初始化

`applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);`初始化後執行

}

Spring底層對 BeanPostProcessor 的使用

1. bean賦值
2. 註入其他組件
3. @Autowired
4. 生命周期註解功能
5. @Async,xxx

使用:

  1. 指定初始化和銷毀方法;通過@Bean指定initMethod和destroyMethod;

    例:@Bean(initMethod="init",destroyMethod="destroy")

  2. 通過讓Bean實現InitializingBean(定義初始化邏輯),DisposableBean(定義銷毀邏輯)

    package cn.willvi.bean;
    
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Man implements InitializingBean,DisposableBean{
    
     public Man() {
         System.out.println("Man創建");
     }
    
    
     public void destroy() {
         System.out.println("Man摧毀");
     }
    
     public void afterPropertiesSet() throws Exception {
         System.out.println("Man初始化");
    
     }
    }
  3. 可以使用JSR250;

    1. @PostConstruct:在bean創建完成並且屬性賦值完成;來執行初始化方法
    2. @PreDestroy:在容器銷毀bean之前通知我們進行清理工作
    package cn.willvi.bean;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.stereotype.Component;
    @Component
    public class Woman {
    
     public Woman() {
         System.out.println("woman創建");
     }
     @PreDestroy
     public void destroy() {
         System.out.println("Woman摧毀前執行");
     }
     @PostConstruct
     public void init(){
         System.out.println("Woman初始化");
    
     }
    }

    ?

  4. BeanPostProcessor【interface】:bean的後置處理器;在bean初始化前後進行一些處理工作

    1. postProcessBeforeInitialization:在初始化之前工作
    2. postProcessAfterInitialization:在初始化之後工作
    package cn.willvi.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    @Component
    public class ManBeanPostProcessor implements BeanPostProcessor{
    
     public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
         if(arg1.equals("man")) {
             System.out.println("----------------------BeanPostProcessor初始化後執行");
         }
         return arg0;
     }
    
     public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
         if(arg1.equals("man")) {
             System.out.println("---------------------BeanPostProcessor初始化前");
         }
         return arg0;
     }
    }
    

Spring註解開發-全面解析常用註解使用方法之生命周期