在servlet3.0的規(guī)范中指出,基于SPI的方式在META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的類(繼承自javax.servlet.ServletContainerInitializer)在容器啟動的時候會調(diào)用該類的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的項目并不是一個標(biāo)準(zhǔn)的web項目,所以并不會執(zhí)行該類,原因在于spring boot項目使用內(nèi)嵌的tomcat,啟動時未設(shè)定web類型
例如:
#這是內(nèi)嵌的tomcat 因為tomcat是java編寫的,引入相應(yīng)的包可以直接new一個啟動Tomcat
Tomcat tomcat = new Tomcat();
//tomcat.addWebapp("/',""C:\\Users\\root\\Desktop\\webapp") #此處便是設(shè)定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的內(nèi)嵌tomcat,由編碼形式啟動tomcat,因為不是標(biāo)準(zhǔn)web所以SPI機(jī)制失效