SpringBoot 如何添加容器啟動的初始化邏輯的操作方法
背景
傳統(tǒng) SpringMVC 項目中,我們可以定義容器初始化 Servlet ,然后在 web.xml 配置該 Servlet ,指定 load-on-startup 就可以在容器啟動后,執(zhí)行一些系統(tǒng)的初始化邏輯。比如設(shè)置全局資源文件路徑、加載系統(tǒng)定時任務(wù)、數(shù)據(jù)初始化等。
技術(shù)轉(zhuǎn)換到 SpringBoot 的時候,該在哪里添加應(yīng)用初始化的代碼呢?
如果初始化邏輯中,有一些普通類,需要通過 Spring 的 ApplicationContext
的 getBean
獲取依賴屬性,如何保證 Spring 容器已經(jīng)完成初始化完成、getBean 不會出現(xiàn)空指針呢?
本文將介紹這兩個問題。
SpringBoot 啟動類和應(yīng)用監(jiān)聽器
首先,SpringBoot 啟動類中可以添加應(yīng)用的初始化邏輯,但是打包方式不同,添加的地方也有差異。
jar 包:使用內(nèi)嵌 Tomcat 時,可以直接寫在 main 函數(shù)中,且 SpringApplication.run
代碼之前,容器未啟動,此時無法獲取 getBean
實例。war 包:外部部署時,main 函數(shù)中的方法不會被執(zhí)行,可以在 configure 方法中添加初始化邏輯,此時容器未啟動,無法獲取 getBean
實例。
其次,就是自定義容器啟動監(jiān)聽器類,為其添加 @Componnet
注解:
@Component public class InitContextListener implements ApplicationListener<ContextRefreshedEvent> { private static Logger logger = Logger.getLogger(InitContextListener.class); @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { // 設(shè)置全局配置信息文件存儲路徑 String path = ClassUtils.getDefaultClassLoader().getResource("").getPath(); logger.info("onApplicationEvent 項目部署路徑為:"+path); VersionManager.resourcePath = path; // TODO 應(yīng)用初始化邏輯,容器此時已啟動,getBean 獲取實例 OK } }
IDEA 直接運(yùn)行
IDEA 中直接運(yùn)行 SpringBoot 的啟動類,它會執(zhí)行初始化邏輯:
configure
方法不會執(zhí)行,main
中的初始化邏輯會生效,onApplicationEvent
監(jiān)聽方法也會執(zhí)行。
war 包發(fā)布
打成 war 包后,啟動應(yīng)用,SpringBoot 的啟動類的 main
方法不會執(zhí)行,configure
方法中的初始化邏輯會生效,onApplicationEvent
監(jiān)聽方法也會執(zhí)行。
1、應(yīng)用啟動之前,先執(zhí)行 configure 方法:
2、啟動之后的,onApplicationEvent
監(jiān)聽方法執(zhí)行:
jar 包發(fā)布
打成 jar 包,跟直接運(yùn)行 IDEA 的結(jié)果一樣。
1、應(yīng)用啟動之前,啟動類的 main
函數(shù) SpringApplication.run
之前的初始化信息:
2、應(yīng)用啟動之后,啟動類的 main 函數(shù) SpringApplication.run
之后的初始化信息,onApplicationEvent
監(jiān)聽事件會執(zhí)行:
啟示錄
記住一種就夠了,用 ApplicationListener
在容器啟動之后,添加應(yīng)用需要的初始化邏輯,本質(zhì)上跟定義一個開機(jī)啟動的 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>
方便極了!
到此這篇關(guān)于SpringBoot 如何添加容器啟動的初始化邏輯的文章就介紹到這了,更多相關(guān)SpringBoot 添加容器啟動的初始化邏輯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot學(xué)習(xí)入門之AOP處理請求詳解
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù),下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之AOP處理請求的相關(guān)資料,需要的朋友可以參考下。2017-09-09Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式
這篇文章主要介紹了Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式,設(shè)計模式的建立有利于團(tuán)隊協(xié)作時代碼的共同維護(hù),需要的朋友可以參考下2016-01-01Spring中BeanFactory與FactoryBean接口的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Spring中BeanFactory與FactoryBean接口的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03