Spring Boot 使用外置的servlet容器

外面安装tomcat,项目打包为war,嵌入式tomcat指定为provide

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provide</scope>
</dependency>

新建 SpringBootServletInitializer 子类

public class MyServletInitializer extends SpringBootServletInitializer {
   
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
   
        return builder.sources(StartApplication.class);
    }
}

启动tomcat服务器

启动报错 查看tomcat版本,tomcat使用的jdk版本
在这里插入图片描述
查看tomcat jdk版本:
bin目录下 命令version 查看版本
在这里插入图片描述
修改tomcat jdk版本:
windows
找到bin下的setclasspath.bat文件;在文件的开始出添加如下代码来设定JAVA_HOME和JRE_HOME的路径:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181

linux
在bin下找到setclasspath.sh,在文件的最开始加入如下代码:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181
修改了setclasspath文件之后,tomcat在启动时便使用设定的JDK。启动tomcat可以通过运行bin下的startup.bat,startup.bat会调用catalina.bat文件,而catalina.bat会调用setclasspath.bat文件来获取JAVA_HOME和JRE_HOME这两个环境变量的值,因此若要在tomcat启动时指向特定的JDK,则需在setclasspath.bat文件的开头处加上JAVA_HOME和JRE_HOME。

原理:

jar包方式运行:执行springboot主类的main方法,启动ioc容器,创建嵌入式的servlet容器
war包方式:启动服务器,服务器启动springboot容器,启动ioc容器

  • servlet3.0标准ServletContainerInitializer扫描jar包中META-INF/services/ServletContainerInitializer文件指定的类并加载
  • 加载spring web包下的SpringServletContainerInitializer
  • 扫描@HandleTypes(WebApplicationInitializer)注解
  • 加载SpringBootServletInitializer 并运行onStartup方法
  • 加载@SpringBootApplication主类,启动容器等

servlet3.0中 服务器web应用启动,会创建当前web应用里面每一个jar包里面的ServletContainerInitializer 实例,
ServletContainerInitializer 的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer 的文件,内容就是ServletContainerInitializer 实现类的全类名
我们还可以使用@HandleTypes注解,在应用启动的时候,加载我们感兴趣的类

流程:

  • 启动tomcat

  • 查找jar包下的SpringBootServletInitializer 实例,先找到jar包下的META-INF/services文件夹
    在spring的web模块org.springframework.web下有这个文件javax.servlet.ServletContainerInitializer
    在这里插入图片描述
    web包下 META-INF\services\javax.servlet.ServletContainerInitializer中指定的SpringServletContainerInitializer类:

    @HandlesTypes({
         WebApplicationInitializer.class})
    public class SpringServletContainerInitializer implements ServletContainerInitializer {
         
        public SpringServletContainerInitializer() {
         
        }
    
        public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
         
            List<WebApplicationInitializer> initializers = new LinkedList();
            Iterator var4;
            if(webAppInitializerClasses != null) {
         
                var4 = webAppInitializerClasses.iterator();
    
                while(var4.hasNext()) {
         
                    Class<?> waiClass = (Class)var4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值