日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

tomcat部署war包步驟 tomcat啟動war包原理

Springboot工程war包模式啟動流程

tomcat部署war包步驟 tomcat啟動war包原理


【tomcat部署war包步驟 tomcat啟動war包原理】出于項目部署的需要,目前做的一個項目需要通過war包進行部署,那么就帶來一個問題,就是在原本的main方法中進行的一些邏輯會失效,以至于出現(xiàn)一些不可預(yù)知的錯誤#1 。在這里加載了一個classpath下的一個json文件,將其加載到系統(tǒng)屬性中,但是在后續(xù)運行時出現(xiàn)NullPointException 。很納悶,我這本地運行的好好的,咋發(fā)布到環(huán)境上就出問題了,后面一翻源碼才明白,原來我們本地運行是java -jar模式運行的,此時虛擬機運行的是工程的main方法 。但是發(fā)布到環(huán)境后,是以war包運行的,此時將不會執(zhí)行本工程的main方法,而是由tomcat的main方法進行啟動 。這個時候問題問題就來了,數(shù)據(jù)沒加載到全局系統(tǒng)變量中 。
1#

tomcat部署war包步驟 tomcat啟動war包原理



在查閱了spring-web這個依賴后,在META-INF下有services的文件夾,
javax.servlet.ServletContainerInitializer,這個東西具體是干什么的呢?其實就是在tomcat啟動后,通過JDK的SPI調(diào)用實現(xiàn)了文件里面的類,這里spring使用了org.springframework.web.SpringServletContainerInitializer,打開這個類會發(fā)現(xiàn)class上有個HandlesTypes的注解,那么這個里面修飾的class是做什么用的呢,主要作為onStartup方法的入?yún)⑹褂谩獁ebAppInitializerClasses
會收集所有實現(xiàn)了這個接口的類,循環(huán)調(diào)用他們的onStartup方法 。
#2

tomcat部署war包步驟 tomcat啟動war包原理


#3

tomcat部署war包步驟 tomcat啟動war包原理



然后我們的啟動類
org.springframework.boot.web.servlet.support.SpringBootServletInitializer剛好又是它的子類,那么會調(diào)用到它 。這里采用了模板設(shè)計模式 。

org.springframework.boot.web.servlet.support.SpringBootServletInitializer#configure這個方法作為org.springframework.boot.web.servlet.support.SpringBootServletInitializer#createRootApplicationContext的一部分,作為鉤子方法影響主流程 。構(gòu)建出一個SpringApplication對象后執(zhí)行它的run方法,這里就是最常規(guī)的Springboot工程啟動了
#4

tomcat部署war包步驟 tomcat啟動war包原理



最后的解決方案是通過訂閱spring的容器刷新事件來完成靜態(tài)數(shù)據(jù)的加載#5,因為無論是jar包啟動,還是war包啟動,都是要調(diào)用spring的核心方法——refresh,當(dāng)刷新完成后,會拋出一個ContextRefreshedEvent事件,所有訂閱這個事件的bean都會收到,在這里進行部分操作完成一些數(shù)據(jù)加載工作
#5

tomcat部署war包步驟 tomcat啟動war包原理


    推薦閱讀