Spring WebApplicationinitializer位于 Sring web下的 package org.springframework.web;
容器啟動(dòng)之后會(huì)調(diào)用該接口的on startup方法耸别;代碼如下
為什么容器啟動(dòng)之后會(huì)調(diào)用該接口的on startup 方法,主要是由于位于它同包下的另一個(gè)類 SpringServletContainerInitializer
可以看到SpringServletContainerInitializer 主要是繼承了ServletContainerInitializer 會(huì)在容器啟動(dòng)之后調(diào)用onStrartUp方法,該方法有兩個(gè)參數(shù),一個(gè)是Set<Class>,一個(gè)是容器上下文ServletContext。Set<Class>的值由類頭部的注解 @HandlesTypes(WebApplicationInitializer.class)控制酪术,會(huì)傳入所有繼承了注解的類的class,將set<class>和ServletContext傳入該方法后,會(huì)通過放射的方式創(chuàng)建每一個(gè)類的實(shí)例保存到list中恤磷,并調(diào)用每一個(gè)類的onStartUp方法,執(zhí)行初始化操作野宜。
ServletContainerInitializer 是位于javax.servlet包下的類扫步,容器啟動(dòng)之后會(huì)調(diào)用該類的onStartup方法。
可以看到類上的注釋匈子,大致意思為:繼承這個(gè)接口必須在jar文件的 META-INF/services目錄下聲明一個(gè)文件河胎,文件的名字是這個(gè)接口的完全限定類名稱,并將被運(yùn)行時(shí)的服務(wù)提供者查找機(jī)制或者被容器中特定的類似機(jī)制發(fā)現(xiàn)虎敦。在任一情況下游岳,來自web服務(wù)器的jar排除的獨(dú)立命令必須被忽略,發(fā)現(xiàn)這些服務(wù)的順序必須遵循應(yīng)用程序的加載委托模式其徙。
去Spring的源碼去找胚迫,就會(huì)發(fā)現(xiàn)接口聲明的文件