20240709每日后端--------Spring Boot的启动流程

目标

了解Spring Boot的启动流程

步骤

每个 Spring Boot 项目都有一个用 @SpringBootApplication 注释的主启动类。


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

通过直接检查 SpringApplication.run 方法,你会发现整个启动过程分为两部分:SpringBootApplication构造函数和run方法的执行。

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {  
 return new SpringApplication(primarySources).run(args);
}

核心注释

当您打开 @SpringBootApplication 注释时,您会发现一堆注释,但重要的是要关注三个核心注释:

@SpringBootConfiguration


它是 @Configuration 注释的包装器。它通过JavaConfig配置bean,将当前类标记为配置类。

@EnableAutoConfiguration

打开 @EnableAutoConfiguration 注解可以看到两个核心注解:@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)

@AutoConfigurationPackage

@AutoConfigurationPackage与 @Component 注释的含义类似。一种用于手动添加注解来加载自动配置类,另一种用于扫描指定路径来注入bean。 @AutoConfigurationPackage 用于在单个路径中加载多个自动配置类时。该注解无需为每个类单独添加 @Import ,从而更方便地简单地导入包路径。 @ComponentScan 对于自定义包路径很有用,例如,当某些 Bean 与 SpringBootApplication 不在同一路径中时。

@Import(AutoConfigurationImportSelector.class)

@Import(AutoConfigurationImportSelector.class) 涉及 AutoConfigurationImportSelector 类,特别是它的 getCandidateConfigurations() 方法。此方法使用 SpringFactoriesLoader.loadFactoryNames() 查找并加载 META-INF/spring.factories 文件中列出的所有自动配置类。

@ComponentScan

1、默认情况下,它扫描当前包及其子包。用 @Component 、 @Controller 、 @Service 、 @Repository 等注解的类注册在容器中供使用。


上面的注释只是将必要的类加载到类路径中。获取类并将其转换为 bean 的实际过程发生在 run 方法中。因此,在回答这方面的问题时,建议先提及核心注释。主要的启动流程还是围绕SpringBootApplcation类的构造函数和run方法展开。

概括

Spring Boot应用程序启动的总体步骤。
1、整个Spring框架的启动分为两部分: constructing a SpringApplication object 和执行 run 方法。
2、核心注解 @SpringBootConfiguration 表示启动类是一个配置类。 @EnableAutoConfiguration 通过其内部 @Import 注释 AutoConfigurationImportSelector.class 实现自动配置。 @ComponentScan 默认情况下扫描当前目录及其子目录中的 bean。
3、构造函数:

  • 根据servlet类是否加载来判断是否为Web环境。
  • 检索所有初始化器,扫描 META-INF/spring.factories 下的所有
    ApplicationContextInitializer 子类并通过反射获取实例,以在Spring实例启动前后执行一些回调操作。
  • 检索所有监听器,与上面类似,扫描配置并加载相应的类实例。
  • 找到主要方法。

相关推荐

  1. 20240709每日--------Spring Boot启动流程

    2024-07-10 11:14:06       36 阅读
  2. SpringBoot启动流程

    2024-07-10 11:14:06       23 阅读
  3. 存储流程结构思考

    2024-07-10 11:14:06       22 阅读
  4. springboot项目

    2024-07-10 11:14:06       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 11:14:06       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 11:14:06       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 11:14:06       90 阅读
  4. Python语言-面向对象

    2024-07-10 11:14:06       98 阅读

热门阅读

  1. qt 播放相机的数据

    2024-07-10 11:14:06       32 阅读
  2. PHP的发展历程以及功能使用场景

    2024-07-10 11:14:06       32 阅读
  3. Redis哨兵模式与集群模式的快速部署

    2024-07-10 11:14:06       25 阅读
  4. 单片机与FPGA的关系及其在嵌入式系统中的应用

    2024-07-10 11:14:06       32 阅读
  5. Hadoop中的副本、校验和(数字指纹)、block

    2024-07-10 11:14:06       22 阅读
  6. Xshell 和宝塔有啥区别

    2024-07-10 11:14:06       30 阅读