在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 初始化的三种方式
- 在servlet3之前加载spring都是基于web.xml,所以需要在web.xml配置spring的监听器以及mvc的servlet等
- 在servlet3之后的spring4和5已经可以零配置,不在需要web.xml初始化工作而是基于SPI实现
- 基于spring boot的内嵌tomcat,由编码形式启动tomcat,因为不是标准web所以SPI机制失效