程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

后端面试每日一题 Spring Boot 启动源码分析

发布于2021-05-29 20:55     阅读(490)     评论(0)     点赞(24)     收藏(2)


Spring Boot 本质上是 Spring 的延伸,它是基于 Spring 的,它为快速构建和开发 Spring 提供了有力的支撑。

Spring Boot 的四大特性:更快速的构建能力、起步依赖、内嵌容器支持、Actuator 监控支持等

Spring Boot 启动源码分析

我们知道 Spring Boot 程序的入口是 SpringApplication.run(Application.class, args) 方法,那么就从 run() 方法开始分析吧,它的源码如下:

public ConfigurableApplicationContext run(String... args) {
    // 1.创建并启动计时监控类
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    // 2.声明应用上下文对象和异常报告集合
    ConfigurableApplicationContext context = null;
    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
    // 3.设置系统属性 headless 的值
    this.configureHeadlessProperty();
    // 4.创建所有 Spring 运行监听器并发布应用启动事件
    SpringApplicationRunListeners listeners = this.getRunListeners(args);
    listeners.starting();
    Collection exceptionReporters;
    try {
        // 5.处理 args 参数
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        // 6.准备环境
        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
        this.configureIgnoreBeanInfo(environment);
        // 7.创建 Banner 的打印类
        Banner printedBanner = this.printBanner(environment);
        // 8.创建应用上下文
        context = this.createApplicationContext();
        // 9.实例化异常报告器
        exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
        // 10.准备应用上下文
        this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        // 11.刷新应用上下文
        this.refreshContext(context);
        // 12.应用上下文刷新之后的事件的处理
        this.afterRefresh(context, applicationArguments);
        // 13.停止计时监控类
        stopWatch.stop();
        // 14.输出日志记录执行主类名、时间信息
        if (this.logStartupInfo) {
            (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
        }
        // 15.发布应用上下文启动完成事件
        listeners.started(context);
        // 16.执行所有 Runner 运行器
        this.callRunners(context, applicationArguments);
    } catch (Throwable var10) {
        this.handleRunFailure(context, var10, exceptionReporters, listeners);
        throw new IllegalStateException(var10);
    }
    try {
        // 17.发布应用上下文就绪事件
        listeners.running(context);
        // 18.返回应用上下文对象
        return context;
    } catch (Throwable var9) {
        this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
        throw new IllegalStateException(var9);
    }
}

从以上源码可以看出 Spring Boot 的启动总共分为以下 18 个步骤。

  • Spring Boot 的启动流程

  • 1.创建并启动计时监控类
    此计时器是为了监控并记录 Spring Boot 应用启动的时间的,它会记录当前任务的名称,然后开启计时器。

  • 2.声明应用上下文对象和异常报告集合
    此过程声明了应用上下文对象和一个异常报告的 ArrayList 集合。

  • 3.设置系统属性 headless 的值
    设置 Java.awt.headless = true,其中 awt(Abstract Window Toolkit)的含义是抽象窗口工具集。设置为 true 表示运行一个 headless 服务器,可以用它来作一些简单的图像处理。

  • 4.创建所有 Spring 运行监听器并发布应用启动事件
    此过程用于获取配置的监听器名称并实例化所有的类。

  • 5.初始化默认应用的参数类
    也就是说声明并创建一个应用参数对象。

  • 6.准备环境
    创建配置并且绑定环境(通过 property sources 和 profiles 等配置文件)。

  • 7.创建 Banner 的打印类
    Spring Boot 启动时会打印 Banner 图片,如下图所示:

img
此 banner 信息是在 SpringBootBanner 类中定义的,我们可以通过实现 Banner 接口来自定义 banner 信息,然后通过代码 setBanner() 方法设置 Spring Boot 项目使用自己自定义 Banner 信息,或者是在 resources 下添加一个 banner.txt,把 banner 信息添加到此文件中,就可以实现自定义 banner 的功能了。

  • 8.创建应用上下文
    根据不同的应用类型来创建不同的 ApplicationContext 上下文对象。
  • 9.实例化异常报告器
    它调用的是 getSpringFactoriesInstances() 方法来获取配置异常类的名称,并实例化所有的异常处理类。
  • 10.准备应用上下文
    此方法的主要作用是把上面已经创建好的对象,传递给 prepareContext 来准备上下文,例如将环境变量 environment 对象绑定到上下文中、配置 bean 生成器以及资源加载器、记录启动日志等操作。
  • 11.刷新应用上下文
    此方法用于解析配置文件,加载 bean 对象,并且启动内置的 web 容器等操作。
  • 12.应用上下文刷新之后的事件处理
    这个方法的源码是空的,可以做一些自定义的后置处理操作。
  • 13.停止计时监控类
    停止此过程第一步中的程序计时器,并统计任务的执行信息。
  • 14.输出日志信息
    把相关的记录信息,如类名、时间等信息进行控制台输出。
  • 15.发布应用上下文启动完成事件
    触发所有 SpringApplicationRunListener 监听器的 started 事件方法。
  • 16.执行所有 Runner 运行器
    执行所有的 ApplicationRunner 和 CommandLineRunner 运行器。
  • 17.发布应用上下文就绪事件
    触发所有的 SpringApplicationRunListener 监听器的 running 事件。
  • 18.返回应用上下文对象
    到此为止 Spring Boot 的启动程序就结束了,我们就可以正常来使用 Spring Boot 框架了。

原文链接:https://blog.csdn.net/abu935009066/article/details/117298270



所属网站分类: 技术文章 > 博客

作者:我是个大美女

链接:http://www.javaheidong.com/blog/article/207466/0dd92ccc0cebf00c12e8/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

24 0
收藏该文
已收藏

评论内容:(最多支持255个字符)