Spring容器初始化完成後執行業務邏輯的三種方式
阿新 • • 發佈:2021-01-23
一 業務背景
監聽應用容器啟動完畢並掃描容器類特定的Dubbo服務,並把相關元資料註冊到閘道器。
二 思路
1 在容器啟動構造元資料上報到閘道器,影響應用啟動效能;
2 監聽容器啟動完畢後構造元資料上報到閘道器,無效能影響;
三 監聽應用啟動完畢的三種方式
方法一、
package com.leadsoft.test.executor.processor public class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { //需要執行的邏輯程式碼,當spring容器初始化完成後就會執行該方法。 } }
同時在Spring的配置檔案中,添加註入:
<!-- 當Spring容器啟動完成後執行下面的這個Bean -->
<bean class = "com.leadsoft.test.executor.processor.InstantiationTracingBeanPostProcessor" />
但是這個時候,會存在一個問題,在web 專案中(spring mvc),系統會存在兩個容器,
一個是root application context ,
另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。
這種情況下,就會造成onApplicationEvent方法被執行兩次。
為了避免上面提到的問題,我們可以只在root application context初始化完成後呼叫邏輯程式碼,
其他的容器的初始化完成,則不做任何處理,修改後程式碼
如下:
@Override public void onApplicationEvent(ContextRefreshedEvent event) { //root application context 沒有parent,他就是老大. if (event.getApplicationContext().getParent() == null ){ //需要執行的邏輯程式碼,當spring容器初始化完成後就會執行該方法。 } }
方法二、
其實更簡單的方法是使用註解:`@PostConstruct`,
只需要在需要啟動的時候執行的方法上標註這個註解就搞定了。
方法三、
方法實現InitializingBean或者ServletContextAware