Spring源码分析【3】-SpingWebInitializer的加载

SpingWebInitializer的加载

Spring基于注解的配置代码:

public class SpingWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

整体调用UML图:

《Spring源码分析【3】-SpingWebInitializer的加载》

SpringServletContainerInitializer.onStartup传入参数:

《Spring源码分析【3】-SpingWebInitializer的加载》

类型判断必须是继承WebApplicationInitializer接口:

《Spring源码分析【3】-SpingWebInitializer的加载》

isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。   
  通常调用格式是   
        Class1.isAssignableFrom (Class2)   
  调用者和参数都是   java.lang.Class   类型。   
      
  而   instanceof   是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。   
    格式是:   oo   instanceof   TypeName     
    第一个参数是对象实例名,第二个参数是具体的类名或接口名 

参考:Class.isAssignableFrom与 instanceof 区别

List<WebApplicationInitializer> initializers:

《Spring源码分析【3】-SpingWebInitializer的加载》

onStartup()调用链:

AbstractDispatcherServletInitializer 有onStartup()

->AbstractAnnotationConfigDispatcherServletInitializer 无onStartup()

->SpingWebInitializer  无onStartup()

《Spring源码分析【3】-SpingWebInitializer的加载》

调用父类的AbstractContextLoaderInitializer的onStartup()

《Spring源码分析【3】-SpingWebInitializer的加载》

调用createRootApplicationContext()

《Spring源码分析【3】-SpingWebInitializer的加载》

createRootApplicationContext()调用链:

AbstractAnnotationConfigDispatcherServletInitializer有createRootApplicationContext()

->AbstractDispatcherServletInitializer无createRootApplicationContext()

->AbstractContextLoaderInitializer调用createRootApplicationContext()

继承的调用链是逐级往下逐级往上

终于调用到getRootConfigClasses()开始第一阶段

《Spring源码分析【3】-SpingWebInitializer的加载》

register就是往set集合增加类

public void register(Class<?>... annotatedClasses) {
		Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");
		this.annotatedClasses.addAll(Arrays.asList(annotatedClasses));
	}

《Spring源码分析【3】-SpingWebInitializer的加载》

《Spring源码分析【3】-SpingWebInitializer的加载》

回到registerContextLoaderListener

《Spring源码分析【3】-SpingWebInitializer的加载》

ContextLoaderListener

《Spring源码分析【3】-SpingWebInitializer的加载》

ContextLoader

《Spring源码分析【3】-SpingWebInitializer的加载》

返回ContextLoaderListener

《Spring源码分析【3】-SpingWebInitializer的加载》

调用tomcat的ApplicationContextFacade implements ServletContext 调用addListener

《Spring源码分析【3】-SpingWebInitializer的加载》

调用addListener

《Spring源码分析【3】-SpingWebInitializer的加载》

addApplicationLifecycleListener

《Spring源码分析【3】-SpingWebInitializer的加载》

applicationLifecycleListenersObjects

《Spring源码分析【3】-SpingWebInitializer的加载》

newListeners

《Spring源码分析【3】-SpingWebInitializer的加载》

回到registerContextLoaderListener

《Spring源码分析【3】-SpingWebInitializer的加载》

完成onStartup

《Spring源码分析【3】-SpingWebInitializer的加载》

进入registerDispatcherServlet

《Spring源码分析【3】-SpingWebInitializer的加载》

调用createServletApplicationContext

《Spring源码分析【3】-SpingWebInitializer的加载》

开始第二阶段进入SpingWebInitializer的getServletConfigClasses

《Spring源码分析【3】-SpingWebInitializer的加载》

register同第一阶段

《Spring源码分析【3】-SpingWebInitializer的加载》

回到registerDispatcherServlet

《Spring源码分析【3】-SpingWebInitializer的加载》

进入tomcat的ApplicationContextFacade addServlet

《Spring源码分析【3】-SpingWebInitializer的加载》

addServlet

《Spring源码分析【3】-SpingWebInitializer的加载》

addChild

《Spring源码分析【3】-SpingWebInitializer的加载》

super.addChild

《Spring源码分析【3】-SpingWebInitializer的加载》

addChildInternal

《Spring源码分析【3】-SpingWebInitializer的加载》

children

《Spring源码分析【3】-SpingWebInitializer的加载》

回到registerDispatcherServlet

《Spring源码分析【3】-SpingWebInitializer的加载》

第三次进入SpingWebInitializer

《Spring源码分析【3】-SpingWebInitializer的加载》

回到registerDispatcherServlet

《Spring源码分析【3】-SpingWebInitializer的加载》

回到onStartup

《Spring源码分析【3】-SpingWebInitializer的加载》

回到onStartup

《Spring源码分析【3】-SpingWebInitializer的加载》

退出到Tomcat的StandardContext的startInternal()

《Spring源码分析【3】-SpingWebInitializer的加载》

entry.getKey()

《Spring源码分析【3】-SpingWebInitializer的加载》

initializers

《Spring源码分析【3】-SpingWebInitializer的加载》

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/unix21/article/details/52067584
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞