一文搞懂SpringBoot启动流程及自动装配


Spring Boot Starter依赖包

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包。你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包

Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。

Spring Boot Starter的设计使得应用可以通过引入不同的Starter来实现模块化的开发。每个Starter都关注—个特定的功能领域,如数据库访问、消息队列、Web开发等。
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成starter
spring-boot-starter-activemq 集成ActiveMQ

SpringBoot 的启动流程

Spring Boot的启动流程可以概括为以下几个步骤:

1. 加载启动类

当 SpringBoot 项目启动时,会在当前工作目录下寻找有@SpringBootApplication注解标识的类,并把这个类作为应用程序的入口点。如果找不到这样的主类,则会打印错误信息并退出。

  • @EnableAutoConfiguration会加载所有符合条件的@Configuration修饰的类

启动类必须使用 @SpringBootApplication 注解标记该类。在启动类的main()方法中,调用了SpringApplication.run() 方法来启动 Spring Boot 应用程序。该方法接受两个参数,第一个参数是启动类的类对象,第二个参数是主方法的参数。

2. 加载配置文件

SpringBoot会自动扫描当前项目的resources目录,并加载其中的application.properties或application.yml等配置文件。这些配置文件中包含了应用程序的各种参数,例如数据库连接信息、日志级别等等。

3. 初始化ApplicationContext

SpringBoot会创建一个SpringApplication对象,调用构造方法:资源加载器、主方法类、确定应用程序类型为Servlet、加载所有初始化类(注册初始化、上下文初始化)、加载所有监听器、确定main方法所在的类。

之后,调用其run()方法来初始化ApplicationContext。这个过程中,【环境准备】SpringBoot会读取配置文件中的参数,并将它们转换成Environment对象中的属性。(加载系统环境变量、JVM系统属性、启动参数args)同时,它还会扫描当前项目中的所有Bean,【容器创建】并将它们注册到ApplicationContext中。

【填充容器refreshContext】ApplicationContext容器创建完成之后,将自身提供的以及自定的所有Bean对象放进容器中【自动装配】包含12个小步骤:自动装配/Bean的生命周期/启动Tomcat。

4. 启动内嵌的Web服务器

SpringBoot内置Tomcat和Jetty等Web服务器,当SpringBoot应用程序启动时,它会根据配置文件中的信息自动创建Tomcat或Jetty等Web容器,并将Spring容器注册到Web容器中,使得SpringBoot应用程序可以直接以Web应用程序的形式运行。

5. 发布启动事件/启动应用程序

根据之前创建好的 Spring 容器以及Web服务器,启动相应的线程进行服务处理。

6. 监听应用程序的状态

SpringBoot会监听应用程序的状态,并根据需要进行相应的操作。例如,当应用程序退出时,它会打印出详细的日志信息,并将应用程序的上下文环境恢复到初始状态。

注:从启动类的Main方法中调用SpringApplication.run(DemoApplication.class, args)方法开始,然后在SpringApplication对象的run方法中做了一系列操作来完成项目启动所需的3. 初始化Spring容器4. 启动内置tomcat5. 启动应用程序以及6. 通知监听者等步骤。

SpringApplication.run()方法源码分析

SpringBoot启动流程

SpringBoot中配置文件的加载顺序:

优先级从高到低,高优先级的配置覆盖低优先级的配置所有配置会形成互补配置。

  1. 命令行参数。所有的配置都可以在命令行上进行指定;
  2. Java系统属性(System.getProperties0))。
  3. 操作系统环境变量。
  4. jar包。外部的application-{profile}.properties或applidation.yml(带spring.profile)配置文件
  5. jar包。内部的application-{profile}.properties或appliction.yml(带spring.profile)配置文件再来加载不带profile。
  6. jar包。外部的application.properties或application.yml(不带spring.profile)配置文件。
  7. jar包。内部的application.properties或application.yml(不带spring.profile)配置文件。
  8. @Configuration注解类上的@PropertySource。

SpringBoot自动配置

@SpringBootApplication注解

在这里插入图片描述

@EnableAutoConfiguration里的两个重要注解

在这里插入图片描述

1. @AutoConfigurationPackage :自动配置包

在这里插入图片描述
Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器。

2. @Import({AutoConfigurationImportSelector.class}):给容器导入组件

AutoConfigurationImportSelector:自动配置导入选择器。AutoConfigurationImportSelector 是 Spring Boot 中一个重要的类,它实现了 ImportSelector 接口,用于实现自动配置的选择和导入。具体来说,它通过分析项目的类路径和条件来决定应该导入哪些自动配置类。

SpringBoot 自动装配原理

SpringBoot 通过 @EnableAutoConfiguration 注解开启自动配置,从classpath中搜寻所有的META-INF/spring.factories配置文件,加载 spring.factories 中注册的各种 AutoConfiguration 类(其中对应的org.springframework.boot.autoconfigure 包下的配置项),当某个 AutoConfiguration 类满足其注解 @Conditional 指定的生效条件 (Starters 提供的依赖、配置或 Spring 容器中是否存在某个 Bean 等)时,通过反射实例化该 AutoConfiguration 类中定义的 Bean (组件等),并注入 Spring 容器,就可以完成依赖框架的自动配置。
在这里插入图片描述
详细分解过程:

  1. 扫描类路径: 在应用程序启动时,AutoConfigurationImportSelector 会扫描类路径上的 META-INF/spring.factories 文件,这个文件中包含了各种 Spring 配置和扩展的定义。在这里,它会查找所有实现了 AutoConfiguration 接口的类,具体的实现为getCandidateConfigurations方法。selectImports()方法获取所有符合条件的类的全限定类名调用getAutoConfigurationEntry(),接着getAutoConfigurationEntry()又调用了getCandidateConfigurations(),getCandidateConfigurations()中SpringFactoriesLoader.loadFactoryNames()方法中传入参数EnableAutoConfiguration.class,loadFactoryNames方法会读取spring.factories中EnableAutoConfiguration.class类名对应的值。
  2. 条件判断: 对于每一个发现的自动配置类,AutoConfigurationImportSelector 会使用条件判断机制(通常是通过 @ConditionalOnXxx 注解)来确定是否满足导入条件。这些条件可以是配置属性、类是否存在、Bean是否存在等等。
  3. 根据条件导入自动配置类: 满足条件的自动配置类将被导入到应用程序的上下文中。这意味着它们会被实例化并应用于应用程序的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值