1. 程式人生 > >Spring 監聽器 ApplicationListener 執行了3遍

Spring 監聽器 ApplicationListener 執行了3遍

前提

專案使用了 Spring 框架,同時也使用了 Spring MVC 。

問題說明

然後在一個類裡面實現了 ApplicationListener 介面,用於在初始化完成後做一些事情,但是通過列印日誌,發現它執行了3次,其中一次是Spring 框架初始化時執行,另外兩次是在專案啟動成功後,載入 projectname-servlet (也就是Spring MVC)時執行的。

通過打斷點看到,這兩次執行中,onApplicationEvent(ApplicationEvent applicationEvent)方法中的 applicationEvent 物件值不同,第一次是 Root WebApplicationContext

後兩次都是專案名稱。不確定為什麼專案名稱執行了兩次,猜測一下,可能是spring會掃描多次整個專案,以免遺漏了註解過的類。最後一次沒有再載入到新的類則停止了。(此段是YY的)

那麼解決方法呢?

我使用的是spring4
可以用這樣的方法處理,判斷一下是不是根物件初始化,是的話就執行,否則不執行。

@Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        try {
            //只在初始化“根上下文”的時候執行
            if (applicationEvent.getSource() instanceof
XmlWebApplicationContext) { if (((XmlWebApplicationContext) applicationEvent.getSource()).getDisplayName().equals("Root WebApplicationContext")) { //……你的程式碼 } } } catch (Exception e) { log.error("((XmlWebApplicationContext) applicationEvent.getSource()).getDisplayName() 執行失敗,請檢查Spring版本是否支援"
); } }