1. 程式人生 > 其它 >Spring容器初始化完成後執行業務邏輯的三種方式

Spring容器初始化完成後執行業務邏輯的三種方式

技術標籤:成神之路Spring

一 業務背景

監聽應用容器啟動完畢並掃描容器類特定的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