spring-boot採用war包啟動模式。
阿新 • • 發佈:2019-01-03
一、demo的結構預覽
二、在jar包啟動的基礎上,需要增加的地方
1)、改成war的maven專案,並且用maven外掛忽略web.xml或者像我這樣建個空的web.xml
1.1 pom中加 <packaging>war</packaging>
1.2 加空檔案。
2)、建立一個類實現SpringBootServletInitializer ,並且覆蓋 configure方法,在方法內注入你標記啟動的類。
/** * war包啟動! ----就是圖1標了紅圈的第二個類 */ public class ApplicationWar extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } }
3)、在pom檔案中將內建容器變成provided
<!-- 內建容器標記成provided -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
4)、 (不是必須)加個tomcat外掛或者jetty外掛。
<!-- tomcat 啟動外掛 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <uriEncoding>UTF-8</uriEncoding> <port>8082</port> //我這個埠故意弄成和jar啟動不一樣 <server>tomcat7</server> </configuration> </plugin>
三、效果。
3.1、用maven的tomcat外掛啟動了個war包埠8082,還用main函式啟動內建tomcat,埠8080.
四、其他
啟動原理大概:
main函式裡面SpringApplication.run()是先啟動內建tomcat,再把spring容器建立,並注入servletContext。而用war啟動,等於servlet3.0裡面只要實現了“某介面”,就會執行這個介面的startup方法,而spring內部就實現了這個介面,再去找你實現的spring的某個介面,最後把你的啟動類注入進去,然後呼叫SpringApplication.run,這個時候就不會注入內建tomcat的servletContext,而是外部的servletContext了。