08--SpringBoot启动容器创建与配置

2018-08-22  本文已影响128人  闲来也无事

上文分析了SpringBoot打印banner和如何自定义打印banner,接下来分析SpringBoot的ApplicationContext容器创建和初步配置,继续run方法

//创建应用上下文对象
context = createApplicationContext();
//获取异常报告对象
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
//准备上下文环境
prepareContext(context, environment, listeners, applicationArguments, printedBanner);

1.创建ApplicationContext

protected ConfigurableApplicationContext createApplicationContext() {
    // 如果当前的applicationContextClass为null,
    // 则判断已经推断出的webApplicationType并创建不同的ApplicationContext容器
    // 因为我们当前使用的是非web环境,所以会实例化AnnotationConfigApplicationContext
    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);
            }
        } catch (ClassNotFoundException ex) {
            throw new IllegalStateException("Unable create a default ApplicationContext, " + "please specify an ApplicationContextClass", ex);
        }
    }
    //org.springframework.context.annotation.AnnotationConfigApplicationContext
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}

// 接下来看看switch里的三个常量值是什么
// 默认web环境
public static final String DEFAULT_WEB_CONTEXT_CLASS = "org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext";
// 默认响应式web环境
public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframeworkboot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";
// 默认环境
public static final String DEFAULT_CONTEXT_CLASS = "org.springframework.context.annotation.AnnotationConfigApplicationContext";

我们当前使用的是非web环境,所以会实例化AnnotationConfigApplicationContext

AnnotationConfigApplicationContext容器的定义是什么呢?
独立应用程序上下文,接受带注释的类作为输入,特别是带注释的类@Configuration,也支持@Componet,以及JSR-303等注解,实现基于Java的配置类加载Spring的应用上下文,查看类结构

image.png
这里会涉及到一部分Spring的知识,我们这里简单分析一下容器创建的过程,以及其中一些比较核心的组件,等该系列写完后,会开一个讲解Spring的专题!

打开AnnotationConfigApplicationContext的父类GenericApplicationContext,我们可以看到

private final DefaultListableBeanFactory beanFactory;

DefaultListableBeanFactory是整个Spring加载Bean最核心的组件,类结构如下


image.png

分析一下其中比较核心的组件

上一篇 下一篇

猜你喜欢

热点阅读