Spring 監聽器 ApplicationListener 執行了3遍
阿新 • • 發佈:2019-02-18
前提
專案使用了 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版本是否支援" );
}
}