1. 程式人生 > >隨spring context初始化完成後init自定義bean

隨spring context初始化完成後init自定義bean

我們想在Spring的所有Bean初始化完畢之後執行一些Bean的init操作

如果我們基於Spring開發Application,那麼我們可能的做法就是,在呼叫Spring初始化完畢之後接著去寫我們的程式碼來初始化

如果我們基於Spring開發Web,那麼我們很可能自定義一個Listener,放在Spring的Listener之後去完成我們的初始化。

無論是哪種,我們都需要從Spring獲取我們的Bean,然後呼叫Bean的init方法

其實,(-------------------------華麗的分割線-------------------)

我們可以藉助Spring的事件去完成我們的場景。具體如下:

我們可能會定義這樣一個藉口:

Java程式碼  收藏程式碼
  1. public interface Initializable {  
  2.     public void init();  
  3. }  

我們希望所有需要init的Bean都實現這個藉口,然後我們在SpringBean初始化之後統一去init

Spring Bean初始化的Event是:ContextRefreshedEvent,我們寫一個Listener去監聽這個Event,程式碼如下:

Java程式碼  收藏程式碼
  1. @Component  
  2. public class Initor implements ApplicationListener {  
  3.     @Autowired(required=false)  
  4.     List<Initializable> initors;  
  5.     @Override  
  6.     public void onApplicationEvent(ApplicationEvent event) {  
  7.         if(null==initors)  
  8.         {  
  9.             return;  
  10.         }  
  11.         if(event instanceof ContextRefreshedEvent)  
  12.         {  
  13.             for
    (Initializable initor:initors)  
  14.             {  
  15.                 initor.init();  
  16.             }  
  17.         }  
  18.     }  
  19. }  

當Spring的Context初始化完成之後就會觸發ContextRefreshedEvent,此時我們根據這個判斷,去完成我們的init

有興趣的同學可以去看看其他的幾種事件:

ContextClosedEvent----------Context關閉時的事件

ContextStartedEvent---------Context啟動後的事件

ContextStoppedEvent--------Context停止後的事件

注意:如果希望是在Bean初始化之後去init,那麼只需要配置init-method就可以了,和本文討論的場景是不一樣的。