spring-boot采用war包启动模式。

一、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.

   

    3.2、war包部署到tomcat解压的样子

    

    

  因为这种war包部署方式其实内部调用的是servlet3.0,所以web.xml直接被吃掉了。

四、其他

    提升了下这个demo的版本到1.4,发现日志框架不能用log4j只能用log4j2。

    启动原理猜测:

    想象下,main函数里面SpringApplication.run()是先启动内置tomcat,再把spring容器建立,并注入servletContext。而用war启动,等于servlet3.0里面只要实现了“某接口”,就会执行这个接口的startup方法,而spring内部就实现了这个接口,再去找你实现的spring的某个接口,最后把你的启动类注入进去,然后调用SpringApplication.run,这个时候就不会注入内置tomcat的servletContext,而是外部的servletContext了。

    demo地址:https://github.com/shuixiou1/spring_boot_base

猜你喜欢

转载自blog.csdn.net/shuixiou1/article/details/79751363