SpringBoot实战分析(六)创建应用程序上下文

程序入口

context = createApplicationContext();

断点跟踪

1.判断环境类型和初始化

当前方法默认加载的是

org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext这个类。

protected ConfigurableApplicationContext createApplicationContext() {
    Class contextClass = this.applicationContextClass;
    if (contextClass == null) {
        try {
            switch (this.webApplicationType) {
            case SERVLET:
                contextClass = Class.forName(DEFAULT_WEB_CONTEXT_CLASS);
                break;
            case REACTIVE:
                contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
                break;
            default:
                contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
            }
        }
  省略。。。。。。
    }
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

contextClass的值域:

SpringBoot实战分析(六)创建应用程序上下文_第1张图片

2.实例化类

获取AnnotationConfigServletWebServerApplicationContext声明的构造器,然后去按照构造器实例化。

public static  T instantiateClass(Class clazz) throws BeanInstantiationException {
    Assert.notNull(clazz, "Class must not be null");
    if (clazz.isInterface()) {
        throw new BeanInstantiationException(clazz, "Specified class is an interface");
    }
    try {
        // 走clazz.getDeclaredConstructor()方法
        Constructor ctor = (KotlinDetector.isKotlinType(clazz) ?
                KotlinDelegate.getPrimaryConstructor(clazz) : clazz.getDeclaredConstructor());
        return instantiateClass(ctor);
    }
    省略。。。。。。
}

public static  T instantiateClass(Constructor ctor, Object... args) throws BeanInstantiationException {
    Assert.notNull(ctor, "Constructor must not be null");
    try {
        ReflectionUtils.makeAccessible(ctor);
        //走ctor.newInstance(args))方法
        return (KotlinDetector.isKotlinType(ctor.getDeclaringClass()) ?
                KotlinDelegate.instantiateClass(ctor, args) : ctor.newInstance(args));
    }
省略。。。。。。
}

3.返回context

SpringBoot实战分析(六)创建应用程序上下文_第2张图片





你可能感兴趣的:(Springboot源码分析)