springboot是如何在没有web.xml的情况下在外部tomcat启动的

本文探讨了SpringBoot如何在没有web.xml的情况下,在Servlet3.0规范支持的外部Tomcat中启动。关键在于ServletContainerInitializer接口和SPI机制。SpringServletContainerInitializer通过SPI被发现并调用,进而初始化WebApplicationInitializer。DispatcherServlet则负责接收并分发请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在公司部署测试环境的时候遇到了问题,本地用springboot内嵌tomcat启动没有问题,部署到测试环境的外部tomcat就不加载,在咨询了同事之后在启动类上继承了SpringBootServletInitializer之后就没有了问题,但并没有深入去想。由于servlet的规范是要配置web.xml的,包括Struts2和spring都是要在web.xml配置的,有一天在服务器上看编译后的目标文件中居然没有web.xml,结合之前遇到的问题,就想知道springboot应用是如何在没有web.xml的情况下在tomcat启动的,于是就有了如下一篇文章。

概述

web.xml的模式文件是由Sun公司定义的,要用来配置Filter、Listener、Servlet等,先来回顾Spring Mvc的配置

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
​
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    
Spring Boot是一个用于快速搭建和开发Spring应用的框架,它极大地简化了基于Spring的应用开发过程。在Spring Boot中,通常不会使用web.xml这个传统的方式来配置web应用。这是因为Spring Boot遵循“约定优于配置”的原则,提供了许多自动配置的特性。 Spring Boot提供了一个名为SpringApplication的类,这个类提供了运行Spring应用的便捷方法。通常只需要在主类中调用SpringApplication.run()方法即可启动应用。Spring Boot会自动配置大多数标准应用,并且在类路径上有特定的库时,还会开启特定的功能。 然而,如果你确实需要在Spring Boot项目中使用web.xml,这通常意味着你正在将Spring Boot应用打包成WAR文件并部署在传统的Java EE容器中。在这种情况下,Spring Boot提供了特定的配置方式来适应web.xml。 1. 首先,你需要在项目中排除spring-boot-starter-tomcat依赖,或者指定其作用域为provided,因为Servlet容器(如Tomcat)将会由外部提供。 2. 然后,你可以在src/main/webapp/WEB-INF目录下创建你的web.xml文件,并按照Java EE的规范进行配置。web.xml中可以配置Servlet、监听器(Listeners)、过滤器(Filters)等。 3. 最后,你需要创建一个继承自SpringBootServletInitializer的类,并重写configure()方法,这样Spring Boot才能在Servlet容器启动时配置应用上下文。 下面是一个简单的配置SpringBootServletInitializer的示例: ```java import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class MySpringBootServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyApplication.class); } } ``` 这里MyApplication是你Spring Boot的主类。 需要注意的是,这种方式主要是为了部署到传统的Servlet容器中,对于大多数Spring Boot项目,建议使用内嵌的Tomcat,并且不使用web.xml
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值