隨spring context初始化完成後init自定義bean
阿新 • • 發佈:2019-01-25
我們想在Spring的所有Bean初始化完畢之後執行一些Bean的init操作
如果我們基於Spring開發Application,那麼我們可能的做法就是,在呼叫Spring初始化完畢之後接著去寫我們的程式碼來初始化
如果我們基於Spring開發Web,那麼我們很可能自定義一個Listener,放在Spring的Listener之後去完成我們的初始化。
無論是哪種,我們都需要從Spring獲取我們的Bean,然後呼叫Bean的init方法
其實,(-------------------------華麗的分割線-------------------)
我們可以藉助Spring的事件去完成我們的場景。具體如下:
我們可能會定義這樣一個藉口:
Java程式碼- public interface Initializable {
- public void init();
- }
我們希望所有需要init的Bean都實現這個藉口,然後我們在SpringBean初始化之後統一去init
Spring Bean初始化的Event是:ContextRefreshedEvent,我們寫一個Listener去監聽這個Event,程式碼如下:
Java程式碼- @Component
-
public class Initor implements ApplicationListener {
- @Autowired(required=false)
- List<Initializable> initors;
- @Override
- public void onApplicationEvent(ApplicationEvent event) {
- if(null==initors)
- {
- return;
- }
- if(event instanceof ContextRefreshedEvent)
- {
-
for
- {
- initor.init();
- }
- }
- }
- }
當Spring的Context初始化完成之後就會觸發ContextRefreshedEvent,此時我們根據這個判斷,去完成我們的init
有興趣的同學可以去看看其他的幾種事件:
ContextClosedEvent----------Context關閉時的事件
ContextStartedEvent---------Context啟動後的事件
ContextStoppedEvent--------Context停止後的事件
注意:如果希望是在Bean初始化之後去init,那麼只需要配置init-method就可以了,和本文討論的場景是不一樣的。