Spring源码分析【3】-SpingWebInitializer的加载
SpingWebInitializer的加載
Spring基于注解的配置代碼:
public class SpingWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[]{RootConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[]{WebConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}
整體調用UML圖:
SpringServletContainerInitializer.onStartup傳入參數:
類型判斷必須是繼承WebApplicationInitializer接口:
isAssignableFrom 是用來判斷一個類Class1和另一個類Class2是否相同或是另一個類的超類或接口。 ??
? 通常調用格式是 ??
? ? ? ? Class1.isAssignableFrom (Class2) ??
? 調用者和參數都是 ? java.lang.Class ? 類型。 ??
? ? ??
? 而 ? instanceof ? 是用來判斷一個對象實例是否是一個類或接口的或其子類子接口的實例。 ??
? ? 格式是: ? oo ? instanceof ? TypeName ? ??
? ? 第一個參數是對象實例名,第二個參數是具體的類名或接口名?
參考:Class.isAssignableFrom與 instanceof 區別
List<WebApplicationInitializer> initializers:
onStartup()調用鏈:
AbstractDispatcherServletInitializer?有onStartup()
->AbstractAnnotationConfigDispatcherServletInitializer?無onStartup()
->SpingWebInitializer??無onStartup()
調用父類的AbstractContextLoaderInitializer的onStartup()
調用createRootApplicationContext()
createRootApplicationContext()調用鏈:
AbstractAnnotationConfigDispatcherServletInitializer有createRootApplicationContext()
->AbstractDispatcherServletInitializer無createRootApplicationContext()
->AbstractContextLoaderInitializer調用createRootApplicationContext()
繼承的調用鏈是逐級往下逐級往上
終于調用到getRootConfigClasses()開始第一階段
register就是往set集合增加類
public void register(Class<?>... annotatedClasses) {Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");this.annotatedClasses.addAll(Arrays.asList(annotatedClasses));}
回到registerContextLoaderListener
ContextLoaderListener
ContextLoader
返回ContextLoaderListener
調用tomcat的ApplicationContextFacade implements ServletContext 調用addListener
調用addListener
addApplicationLifecycleListener
applicationLifecycleListenersObjects
newListeners
回到registerContextLoaderListener
完成onStartup
進入registerDispatcherServlet
調用createServletApplicationContext
開始第二階段進入SpingWebInitializer的getServletConfigClasses
register同第一階段
回到registerDispatcherServlet
進入tomcat的ApplicationContextFacade?addServlet
addServlet
addChild
super.addChild
addChildInternal
children
回到registerDispatcherServlet
第三次進入SpingWebInitializer
回到registerDispatcherServlet
回到onStartup
回到onStartup
退出到Tomcat的StandardContext的startInternal()
entry.getKey()
initializers
總結
以上是生活随笔為你收集整理的Spring源码分析【3】-SpingWebInitializer的加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Mock单元测试
- 下一篇: Spring源码分析【0】-框架的基础: