spring boot mvc项目下为何javax.servlet.ServletContainerInitializer无效?

在servlet3.0的规范中指出,基于SPI的方式在META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的类(继承自javax.servlet.ServletContainerInitializer)在容器启动的时候会调用该类的onStartup方法

例如:

@HandlesTypes(MyInitializer.class) #MyInitializer是一个接口,继承它的子类会在onStartup方法的set参数中传过来
public class MyServletContainerInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        System.out.println("----------ServletContainerInitializer-----------");
    }
}

但是我在spring boot web项目中自定义上面的MyServletContainerInitializer 却并不执行,经过分析原来基于spring boot mvc的项目并不是一个标准的web项目,所以并不会执行该类,原因在于spring boot项目使用内嵌的tomcat,启动时未设定web类型

例如:

#这是内嵌的tomcat 因为tomcat是java编写的,引入相应的包可以直接new一个启动Tomcat
Tomcat tomcat = new Tomcat();

//tomcat.addWebapp("/',""C:\\Users\\root\\Desktop\\webapp") #此处便是设定web类型项目
tomcat.addContext("/","C:\\Users\\root\\Desktop\\webapp");
tomcat.setPort(8080);
try {
  tomcat.start();
  tomcat.getServer().await();
}catch (Exception e) {
  e.printStackTrace();
}

spring 初始化的三种方式

  1. 在servlet3之前加载spring都是基于web.xml,所以需要在web.xml配置spring的监听器以及mvc的servlet等
  2. 在servlet3之后的spring4和5已经可以零配置,不在需要web.xml初始化工作而是基于SPI实现
  3. 基于spring boot的内嵌tomcat,由编码形式启动tomcat,因为不是标准web所以SPI机制失效
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容