springboot启动流程(五)创建ApplicationContext
所有文章
https://www.cnblogs.com/lay2017/p/11478237.html
正文
springboot在启动过程中将会根据当前应用的类型创建对应的ApplicationContext。本文内容较短,承上启下,将不会涉及太多具体的内容,主要在于为后续的ioc内容构建一个ApplicationContext实例。
我们简单回顾一下,在第二篇文章介绍SpringApplication的run方法
public ConfigurableApplicationContext run(String... args) {
    // 声明一个Context容器
    ConfigurableApplicationContext context = null;
    // 获取监听器
    SpringApplicationRunListeners listeners = getRunListeners(args);
    // 调用监听器的启动
    listeners.starting();
    try {
        // 创建并配置Environment(这个过程会加载application配置文件)
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        // 根据应用类型创建对应的Context容器
        context = createApplicationContext();
        // 刷新Context容器之前的准备
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        // 刷新Context容器
        refreshContext(context);
        // 刷新Context容器之后处理
        afterRefresh(context, applicationArguments);
        // Context容器refresh完毕发布
        listeners.started(context);
        // 触发Context容器refresh完以后的执行
        callRunners(context, applicationArguments);
    } catch (Throwable ex) {}
    try {
        // Context启动完毕,Runner运行完毕发布
        listeners.running(context);
    } catch (Throwable ex) {}
    return context;
}
逻辑步骤中,创建Environment之后,刷新ApplicationContext之前,我们还需要做的一件事就是创建ApplicationContext实例,也就是createApplicationContext方法
我们跟进createApplicationContext
public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext";
public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";
public static final String DEFAULT_CONTEXT_CLASS = "org.springframework.context.annotation.AnnotationConfigApplicationContext";
protected ConfigurableApplicationContext createApplicationContext() {
    // 先判断有没有指定的实现类
    Class<?> contextClass = this.applicationContextClass;
    // 如果没有,则根据应用类型选择
    if (contextClass == null) {
        try {
            switch (this.webApplicationType) {
            case SERVLET:
                contextClass = Class.forName(DEFAULT_SERVLET_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);
        }
    }
    // 通过反射获取对应类的实例
    return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}
该方法的逻辑较为简单,走两个分支
1)自定义ApplicationContext的实现类
2)根据当前应用的类型webApplicationType来匹配对应的ApplicationContext,是servlet、reactive或者非web应用
总结
创建ApplicationContext的实例对象较为简单,就是选择实现类,反射获取类的实例对象。至于实现类是自己设置的,还是通过当前应用类型匹配的由开发人员去选择,不过默认情况下都是由类型去推断出来的。
本文虽短,但是后续的文章也基本都是围绕着本文构建的ApplicationContext,这说明spring的核心也基本都包含在这个ApplicationContext当中了。
springboot启动流程(五)创建ApplicationContext的更多相关文章
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
		SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ... 
- SpringBoot启动流程分析(一):SpringApplication类初始化过程
		SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ... 
- SpringBoot启动流程分析(二):SpringApplication的run方法
		SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ... 
- SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法
		SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ... 
- SpringBoot启动流程分析(四):IoC容器的初始化过程
		SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ... 
- SpringBoot启动流程及其原理
		Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ... 
- SpringBoot启动流程解析
		写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ... 
- SpringBoot启动流程分析(六):IoC容器依赖注入
		SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ... 
- springboot启动流程(一)构造SpringApplication实例对象
		所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 启动入口 本文是springboot启动流程的第一篇,涉及的内容是SpringApplicat ... 
- SpringBoot 启动流程
		SpringBoot 启动流程 加载 resources/META-INF/spring.factories 中配置的 ApplicationContextInitializer 和 Applicat ... 
随机推荐
- 解决kali无法连接网络问题
			键入 ifconfig -a 查看网卡 ,是否存在 键入 leafpad /etc/network/interfaces 查看其中是否有如下语句,没有添加上即可:auto eth0iface eth0 ... 
- spring bean容器加载后执行初始化处理@PostConstruct
			先说业务场景,我在系统启动后想要维护一个List常驻内存,因为我可能经常需要查询它,但它很少更新,而且数据量不大,明显符合缓存的特质,但我又不像引入第三方缓存.现在的问题是,该List的内容是从数据库 ... 
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_14-网关-介绍网关及搭建网关工程
			4 Zuul网关 4.1 需求分析 网关的作用相当于一个过虑器.拦截器,它可以拦截多个系统的请求. 本章节要使用网关校验用户的身份是否合法. 4.2 Zuul介绍 什么是Zuul? Spring Cl ... 
- 123456---com.twoapp.ErTongNongChangPinTu---儿童农场拼图
			com.twoapp.ErTongNongChangPinTu---儿童农场拼图 
- PostgreSQL学习笔记——事务
			事务时需要在同一处理单元中执行的一系列更新处理的集合.通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理. 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种 ... 
- 一个区分度很大的iOS面试题
			@property 后面可以有哪些修饰符?@property中有哪些属性关键字? 属性可以拥有的特质分为四类: 原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确 ... 
- python:序列化与反序列化(json、pickle、shelve)
			本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ... 
- 印象笔记·剪藏 Chrome插件
			印象笔记·剪藏 Chrome插件 链接:https://pan.baidu.com/s/10nzrSk_3sLkOI29MIEPEBw 密码:p8n8 
- linux  SSH 隧道
			一 什么是SSH隧道 首 先看下面这张图,我们所面临的大部分情况都和它类似.我们的电脑在右上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连 接着你和路由器,但是在我们的 ... 
- Jquery生成二维码(微信中长按图片识别二维码功能)
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
