在servlet3.0的規(guī)范中指出,基于SPI的方式在META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的類(繼承自javax.servlet.ServletContainerInitializer)在容器啟動的時候會調用該類的onStartup方法
例如:
@HandlesTypes(MyInitializer.class) #MyInitializer是一個接口陋桂,繼承它的子類會在onStartup方法的set參數(shù)中傳過來
public class MyServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("----------ServletContainerInitializer-----------");
}
}
但是我在spring boot web項目中自定義上面的MyServletContainerInitializer 卻并不執(zhí)行蜓竹,經(jīng)過分析原來基于spring boot mvc的項目并不是一個標準的web項目,所以并不會執(zhí)行該類苹支,原因在于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的監(jiān)聽器以及mvc的servlet等
- 在servlet3之后的spring4和5已經(jīng)可以零配置债蜜,不在需要web.xml初始化工作而是基于SPI實現(xiàn)
- 基于spring boot的內嵌tomcat晴埂,由編碼形式啟動tomcat,因為不是標準web所以SPI機制失效