我剛剛用spring boot 初始化程式生成了一個 WAR 打包應用程式,這里是生成的源代碼。
主要應用類
@SpringBootApplication
public class ChargingListenerApplication {
public static void main(String[] args) {
SpringApplication.run(ChargingListenerApplication.class, args);
}
}
servlet 初始值設定項類。
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ChargingListenerApplication.class);
}
}
Spring如何實作這個類并運行configure()?僅僅是因為型別嗎?如果是這樣,像這樣處理而不是正確的注釋是不是有點奇怪?另外,在 Spring 檔案中,它們SpringBootServletInitializer在主類中擴展。
uj5u.com熱心網友回復:
是的,這是因為您正在擴展SpringBootServletInitializer. 它利用 Spring Framework 的 servlet 3.0 支持,并允許您在應用程式由 servlet 容器啟動時對其進行配置,這意味著您的自定義ServletInitializer.configure()將被實際呼叫。
是的,在 Spring 檔案中,它們SpringBootServletInitializer在主類中擴展,但這并不意味著您不能將它放在其他地方。唯一奇怪的是,他們確實推薦了一件事(在主類中擴展它),但初始化程式做了另一件事(創建一個單獨的類),但也許是為了清晰起見是故意的。
uj5u.com熱心網友回復:
所以首先,Spring-web 模塊有一個類SpringServletContainerInitializer,其定義如下。
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {...}
對于注釋句柄型別,
a
ServletContainerInitializer表示感興趣的課程。如果 ServletContainerInitializer 的實作指定了此注解,則 Servlet 容器必須將擴展、實作或已使用此注解列出的型別別進行注解的應用程式類的 Set 傳遞ServletContainerInitializer.onStartup(java.util.Set>,javax.servlet.ServletContext)給 ServletContainerInitializer的 方法(如果沒有找到匹配的類,必須改為傳遞 null)
@Target(value=TYPE)
@Retention(value=RUNTIME)
public @interface HandlesTypes {..}
ServletContainerInitializer是 servlet 介面,容器在啟動期間運行它的所有實作(ofc 實作必須通過 META-INF/services/javax.servlet.ServletContainerInitializer 注冊)
因此,spring 在注冊的SpringServletContainerInitializer類中檢查通過容器傳遞給它的型別,并分別運行它們的 onStartup 方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355782.html
標籤:弹簧靴 servlet-3.0 弹簧自动配置
