Spring Boot启动流程简介说明

欣喜 SpringBoot 发布时间:2023-12-18 17:39:58 阅读数:7287 1
下文笔者讲述SpringBoot启动流程,如下所示 下文笔者将从源码的角度讲述SpringBoot的启动流程,如下所示

springBoot启动代码

@SpringBootApplication
public class Application {
   public static void main(String[] args) throws Exception {
       SpringApplication.run(Application.class, args);
  }
}

代码说明

Annotation定义(@SpringBootApplication)
  和类定义(SpringApplication.run) 

从源码可看出
    @SpringBootApplication相当于 @SpringBootConfiguration + @ComponentScan +  @EnableAutoConfiguration 

以上三个注解的功能:
  注册bean到spring容器
       他们使用不同的条件不同的方式来完成:
          @SpringBootConfiguration 通过与 @Bean 结合完成Bean的 JavaConfig 配置;
          @ComponentScan 通过范围扫描的方式,扫描特定注解注释的类,将其注册到Spring容器;
          @EnableAutoConfiguration 借助spring.factories 的配置
                 并结合@Condition条件
                  完成bean注册

当然SpringBoot中还可以使用
     @Import注解将bean注册到Spring容器

Spring Boot启动流程

SpringApplication的实例化

    推断应用类型是否是Web环境

    设置初始化器(Initializer)

    设置监听器(listener)

    推断应用入口类(Main)

  SpringApplication.run方法

    获取SpringApplicationRunListeners

    准备配置环境ConfigurableEnvironment

    创建ApplicationContext应用上下文

    ApplicationContext前置处理

    ApplicationContext刷新

    ApplicationContext后置处理

   完成了实例化,下面开始调用run方法

// 运行run方法
public ConfigurableApplicationContext run(String... args) {
   // 此类通常用于监控开发过程中的性能,而不是生产应用程序的一部分。
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();

   ConfigurableApplicationContext context = null;
   Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();

   // 设置java.awt.headless系统属性,默认为true
   // Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。
   configureHeadlessProperty();

   // KEY 1 - 获取SpringApplicationRunListeners
   SpringApplicationRunListeners listeners = getRunListeners(args);

   // 通知监听者,开始启动
   listeners.starting();
   try {
       ApplicationArguments applicationArguments = new DefaultApplicationArguments(
               args);

       // KEY 2 - 根据SpringApplicationRunListeners以及参数来准备环境
       ConfigurableEnvironment environment = prepareEnvironment(listeners,
               applicationArguments);
       
       configureIgnoreBeanInfo(environment);

       // 准备Banner打印器 - 就是启动Spring Boot的时候打印在console上的ASCII艺术字体
       Banner printedBanner = printBanner(environment);

       // KEY 3 - 创建Spring上下文
       context = createApplicationContext();

       // 注册异常分析器
       analyzers = new FailureAnalyzers(context);

       // KEY 4 - Spring上下文前置处理
       prepareContext(context, environment, listeners, applicationArguments,
               printedBanner);

       // KEY 5 - Spring上下文刷新
       refreshContext(context);

       // KEY 6 - Spring上下文后置处理
       afterRefresh(context, applicationArguments);

       // 发出结束执行的事件
       listeners.finished(context, null);

       stopWatch.stop();
       if (this.logStartupInfo) {
           new StartupInfoLogger(this.mainApplicationClass)
                  .logStarted(getApplicationLog(), stopWatch);
      }
       return context;
  }
   catch (Throwable ex) {
       handleRunFailure(context, listeners, exceptionReporters, ex);
       throw new IllegalStateException(ex);
  }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202312/7494.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者