SpringBoot 如何新增容器啟動的初始化邏輯的操作方法
背景
傳統 SpringMVC 專案中,我們可以定義容器初始化 Servlet ,然後在 web.xml 配置該 Servlet ,指定 load-on-startup 就可以在容器啟動後,執行一些系統的初始化邏輯。比如設定全域性資原始檔路徑、載入系統定時任務、資料初始化等。
技術轉換到 SpringBoot 的時候,該在哪裡新增應用初始化的程式碼呢?
如果初始化邏輯中,有一些普通類,需要通過 Spring 的 ApplicationContext
的 getBean
獲取依賴屬性,如何保證 Spring 容器已經完成初始化完成、getBean 不會出現空指標呢?
本文將介紹這兩個問題。
SpringBoot 啟動類和應用監聽器
首先,SpringBoot 啟動類中可以新增應用的初始化邏輯,但是打包方式不同,新增的地方也有差異。
jar 包:使用內嵌 Tomcat 時,可以直接寫在 main 函式中,且 SpringApplication.run
程式碼之前,容器未啟動,此時無法獲取 getBean
例項。war 包:外部部署時,main 函式中的方法不會被執行,可以在 configure 方法中新增初始化邏輯,此時容器未啟動,無法獲取 getBean
例項。
其次,就是自定義容器啟動監聽器類,為其新增 @Componnet
註解:
@Component public class InitContextListener implements ApplicationListener<ContextRefreshedEvent> { private static Logger logger = Logger.getLogger(InitContextListener.class); @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { // 設定全域性配置資訊檔案儲存路徑 String path = ClassUtils.getDefaultClassLoader().getResource("").getPath(); logger.info("onApplicationEvent 專案部署路徑為:"+path); VersionManager.resourcePath = path; // TODO 應用初始化邏輯,容器此時已啟動,getBean 獲取例項 OK } }
IDEA 直接執行
IDEA 中直接執行 SpringBoot 的啟動類,它會執行初始化邏輯:
configure
方法不會執行,main
中的初始化邏輯會生效,onApplicationEvent
監聽方法也會執行。
war 包釋出
打成 war 包後,啟動應用,SpringBoot 的啟動類的 main
方法不會執行,configure
方法中的初始化邏輯會生效,onApplicationEvent
監聽方法也會執行。
1、應用啟動之前,先執行 configure 方法:
2、啟動之後的,onApplicationEvent
監聽方法執行:
jar 包釋出
打成 jar 包,跟直接執行 IDEA 的結果一樣。
1、應用啟動之前,啟動類的 main
函式 SpringApplication.run
之前的初始化資訊:
2、應用啟動之後,啟動類的 main 函式 SpringApplication.run
之後的初始化資訊,onApplicationEvent
監聽事件會執行:
啟示錄
記住一種就夠了,用 ApplicationListener
在容器啟動之後,新增應用需要的初始化邏輯,本質上跟定義一個開機啟動的 Servlet 一樣。
只是用 SpringBoot 之後,一個 @Component
註解,就可以替代 web.xml 中對 Servelt 的配置:
<!-- 配置初始化啟動執行緒 --> <servlet> <servlet-name>initServlet</servlet-name> <servlet-class> Xxx.InitContexServlet </servlet-class> <load-on-startup>3</load-on-startup> </servlet>
方便極了!
到此這篇關於SpringBoot 如何新增容器啟動的初始化邏輯的文章就介紹到這了,更多相關SpringBoot 新增容器啟動的初始化邏輯內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!