[SpringBoot]图解SpringBoot启动流程+获取配置流程

一、springboot自动配置

什么是SpringBoot自动配置?
​ SpringBoot的自动配置,指的是SpringBoot会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@autowired或者@resource等注解来使用它。
​ “自动”的表现形式就是我们只需要引我们想用功能的包,相关的配置我们完全不用管,springboot会自动注入这些配置bean,我们直接使用这些bean即可。

SpringBoot如何实现自动配置?
其实说白了SpringBoot的自动配置,实际是依赖@Conditional来实现的。@Conditional是一个条件注解,是Spring4提供的一个新特性,用于根据特定条件来控制Bean的创建行为。

1、springboot获取配置的流程

在这里插入图片描述
上图是对springboot获取配置流程的简单总结。

  • 运行主程序时,调用了@SpringBootApplication注解,这个注解又包含一个@Import注解,用于导入配置类。
  • 这个@Import注解会去类路径下所有的META-INF/spring.factories中去搜索以“AutoConfiguration”为后缀的配置类;
  • 对找到的每一个××AutoConfiguration配置类,根据其上的@EnableConfigurationProperties注解读取对于的××Properties类;
  • 将读取到的××Properties中的属性值绑定到组件中
  • 取用户配置文件,将配置的属性值绑定到组件中
  • 将组件在容器中注册。
    在这里插入图片描述

就这样完成了配置值的获取。

二、springboot启动流程

在这里插入图片描述
上图是对springboot启动流程的简单总结。
运行主配置类时,主要分为两大步骤:首先创建Springboot的Application对象,然后是运行run方法。

2.1创建Springboot的Application对象

创建的对象根据springboot获取配置的流程,绑定了配置里面的默认值。
主要实现的功能就是到META-INF/spring.factories目录下去寻找两类东西并保存起来。

  • 一个是ApplicationContextInitializer,也就是容器的初始化器;
  • 一个是ApplicationListener,也就是应用程序的监听。
    保存的东西供run方法运行时调用。
2.2运行run方法

(1)去META-INF/spring.factories目录下去获取监听,注意获取的是ApplicationRunListener而不是ApplicationListener。
(2)配置环境,然后调用上一步获取的监听的environmentPrepared方法表示环境准备完成
(3)创建ioc容器
(4)应用初始化器

  • 将配置好的环境在ioc容器中布置;
  • 读取创建Springboot的Application对象是保存的两类东西的方法,一个是初始化器,一个是contextPrepared方法,也就是告诉系统容器准备就绪。

(5)在ioc中注册命令行参数对象
(6)调用(1)获取的ApplicationRunListener中的contextLoaded方法表示上下文环境准备完成
(7)刷新容器:也就是获取、创建和加载所有的组件、配置类和自动配置类。
(8)从容器中获取ApplicationRunner和CommandLineRunner,并调用其中的run方法;
(9)调用(1)获取的ApplicationRunListener中的finished方法表示容器创建完成
(10)返回配置好的ioc容器

文章来源:springboot运行流程和实际应用

<think>好的,我现在要处理用户关于SpringBoot自动装配流程的问题。用户已经提供了三个引用,需要根据这些引用来构建回答。首先,我需要理解用户的需求,他们想知道自动装配的流程和原理,特别是结合源码的部分。不过用户提到不能直接引用完整源码,所以需要基于原理和关键组件来说明。 首先,我应该回忆SpringBoot自动装配的基本概念。根据引用[3],自动装配解决了传统Spring的XML配置问题,实现了Bean的自动装配。核心注解包括@SpringBootApplication、@EnableAutoConfiguration和@ComponentScan,如引用[1]所述。接下来,我需要将这些注解的作用和流程串联起来。 用户的问题是关于流程和原理,所以需要分步骤解释。可能的结构是:从主启动类开始,@SpringBootApplication组合了@EnableAutoConfiguration,然后触发自动配置类的加载,通过spring.factories文件读取配置,条件注解筛选,最后注册Bean。 需要注意每个步骤的细节,比如@SpringBootApplication是入口,包含三个注解,其中@ComponentScan负责包扫描,@EnableAutoConfiguration启用自动配置。然后,@EnableAutoConfiguration导入AutoConfigurationImportSelector,这个类会读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件(旧版本可能是spring.factories),获取所有自动配置类。之后,条件注解如@ConditionalOnClass会检查类路径是否存在相关类,决定是否生效。 需要确保术语准确,比如自动配置类通常带有@Configuration,并且结合@Conditional注解。另外,要提到自动配置类的编写方式,比如使用@Bean方法,并可能依赖外部配置属性。 引用[2]提到自动装配简化配置,核心是@EnableAutoConfiguration和spring.factories。这里可能需要结合引用的内容,比如引用[1]中的三个注解,引用[2]的流程概述,以及引用[3]的面试重点。 在组织回答时,要分步骤,每一步解释清楚,并引用对应的文献。比如第一步主启动类,引用[1]中的@SpringBootApplication;第二步加载自动配置类,引用[2]中的原理概述;条件装配部分引用[3]中的条件注解作用。 另外,用户要求生成相关问题,可能需要围绕自动装配的注解、流程、条件机制、与传统Spring的区别等方面提出问题。 需要检查是否符合用户给的格式要求:行内数学表达式用$...$,但这里可能不涉及数学公式。但可能涉及代码块,比如注解的使用,但用户示例中的代码块是Python,而这里可能需要Java代码块。不过根据引用中的内容,用户没有提供具体代码,所以可能不需要代码块,但需要正确使用注解名称,如@SpringBootApplication等。 确保回答结构清晰,分步骤,使用中文,正确引用标记。例如,在提到@SpringBootApplication时,引用[1],在自动装配原理时引用[2],在条件注解时引用[3]。 最后,生成的相关问题应该覆盖流程中的关键点,比如注解的作用、条件装配机制、与组件扫描的关系、如何自定义自动配置等。 现在,整理这些思路,形成结构化的回答,确保每个部分都有对应的引用支持,并自然添加引用标识。</think>### SpringBoot自动装配流程原理分步解析 #### 一、主启动类与注解入口 SpringBoot自动装配的入口是主启动类上的$@SpringBootApplication$注解[^1]。该注解由三个核心注解组合而成: 1. $@SpringBootConfiguration$:标识该类为配置类 2. $@ComponentScan$:启用组件扫描,自动发现并注册当前包及其子包下的组件(如$@Component$, $@Service$等注解标记的类) 3. $@EnableAutoConfiguration$:**关键注解**,触发自动装配机制 #### 二、自动装配核心流程 1. **启用自动配置** - $@EnableAutoConfiguration$通过$@Import$注解导入$AutoConfigurationImportSelector$类[^2] - 该类实现`ImportSelector`接口,负责筛选需要加载的自动配置类 2. **加载自动配置类** ```java // AutoConfigurationImportSelector核心逻辑 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); ``` - 通过`spring-boot-autoconfigure`模块的`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`文件(SpringBoot 2.7+)或旧版`spring.factories`文件加载预定义的配置类列表[^2] - 示例配置项: ``` org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration ``` 3. **条件装配筛选** - 每个自动配置类使用**条件注解**进行控制: - $@ConditionalOnClass$:类路径存在指定类时生效 - $@ConditionalOnMissingBean$:容器中不存在指定Bean时生效 - $@ConditionalOnProperty$:配置参数满足条件时生效 ```java @Configuration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) public class DataSourceAutoConfiguration { // 自动配置逻辑 } ``` - 通过条件判断实现"智能装配",避免冗余配置[^3] 4. **Bean注册** - 通过$@Configuration$+$@Bean$方式注册组件 - 结合$@EnableConfigurationProperties$读取`application.properties`/`application.yml`配置 #### 三、流程图解 $$ \begin{array}{ccc} \text{@SpringBootApplication} & \rightarrow & \text{@EnableAutoConfiguration} \\ \downarrow & & \downarrow \\ \text{组件扫描} & & \text{加载AutoConfigurationImportSelector} \\ & & \downarrow \\ & & \text{读取spring.factories/imports文件} \\ & & \downarrow \\ & & \text{筛选有效配置类} \\ & & \downarrow \\ & & \text{注册Bean到IoC容器} \end{array} $$ ### 关键设计思想 1. **约定优于配置**:预定义常用组件的默认配置 2. **条件化装配**:根据运行环境动态调整配置 3. **SPI扩展机制**:通过`spring.factories`文件实现模块化扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值