spring boot mvc項目下為何javax.servlet.ServletContainerInitializer無效?

在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 初始化的三種方式

  1. 在servlet3之前加載spring都是基于web.xml,所以需要在web.xml配置spring的監(jiān)聽器以及mvc的servlet等
  2. 在servlet3之后的spring4和5已經(jīng)可以零配置,不在需要web.xml初始化工作而是基于SPI實現(xiàn)
  3. 基于spring boot的內(nèi)嵌tomcat,由編碼形式啟動tomcat,因為不是標(biāo)準(zhǔn)web所以SPI機(jī)制失效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容