SpringBoot之自动配置流程说明

本文深入探讨SpringBoot的自动配置机制,解析如何通过简单的注解实现依赖组件的自动实例化,以及SpringBoot启动过程中的核心配置原理。

之前我们一起看了Springboot是如何内嵌tomcat的今天我们来说一下SpringBoot 启动时自动配置 

正如我们看见的只要pom文件里引了你要的依赖

在使用注解 @Autowired 时就能直接实例化使用 这是怎么做到的呢。我们下面就来一起看看。

 

首先我们可以看见Springboot启动时只需要main方法里运行main方法就可以启动了

然后加上了一个@SpringbootApplication的注解

那么Springboot启动时的配置一定和这个注解有莫大的关系,我们跟进来看一下

可以看到这里有引入一些注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited   
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@Documented   注解表明这个注释是由 javadoc记录的。 如果一个类型声明被注释了文档化,它的注释成为公共API的一部分。

@SpringBootConfiguration 这个就是Springboot的配置,标注这个类是一个配置类@EnableAutoConfiguration允许自自动配置关(关键注解) @ComponentScan扫描启动类同级包下的配置进行实例化。

我们先来说一下@SpringBootConfiguration 我们跟进去可以看见下图,可以看出这个SpringBootConfiguration只是@Configuration的派生


 

所以我们还是要看@EnableAutoConfiguration 我们跟进来可以看到组合注解@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class) 我们来进入AutoConfigurationImportSelector

我们进入 AutoConfigurationImportSelector 可以看到他一路来找自动配置

我们进入getCandidateConfigurations 可以看到SpringFactoriesLoader.loadFactoryNames,这里就是来进行Spring工厂加载

我们进来,到这里我们终于要找到正主了

classLoader.getResources
ClassLoader.getSystemResources 这两个指向的是同一个文件我们进去看看

 看看我们发现了什么原来他就是来读取这个文件中的预配置好的组件

 我们进来文件看看,是不是非常熟悉,就是咱们常用的,这里也就解释了为什么注解写一个 @Autowired 就能自动引入了,他就是扫描你的pom文件和这里看看能不能匹配上如果这里没有那么就只能自己配置@Configuration 来自己启动时加载。

我们随便从这个文件中选一个没有pom文件中没有引的包看看,看看是不是很多红色报错呀。这就对了,你可以再点开这个文件中你再pom文件中引了看看。

 这就是Springboot的厉害之处  加载所有组件你引入的就是绿色 没引入就是报红,而且不影响启动。自动配置能做到如此也是厉害了。

本文只是个人观点,如有不正确之处,欢迎指出,我会查证修改。

 

<think>首先,用户的问题是:“我想理解SpringBoot自动配置机制请问SpringBoot自动配置流程详解”。我需要基于系统级指令和用户可见层的要求来回答。 系统级指令: 1.所有行内数学表达式必须使用$...$格式。但在这个问题中,没有数学表达式,所以可能不需要。 2.独立公式必须使用$$...$$格式并单独成段。同样,这里可能没有公式。3.LaTeX语法正确。确保任何数学部分正确,但主题是SpringBoot,所以可能不涉及。 4.使用中文回答。5.生成相关问题。6.回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: 1.回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考提供的引用:- [^1]:介绍了自动配置流程和示例代码。- [^2]:讨论了如何排除特定自动配置。 -[^3]:详细解释了自动配置的实现机制,包括核心组件和加载流程。- [^4]:提到了自动配置通过META-INF/spring.factories文件声明。 我的回答需要基于这些引用,但用户说“上述引用仅供参考”,所以我应该整合这些信息,提供一个详细的解释。结构清晰的回答:-逐步解释Spring Boot自动配置流程。 -使用标题或分段来组织内容。 -确保真实可靠,基于标准Spring Boot知识。关键点从引用中提取: -自动配置的核心是@SpringBootApplication和@EnableAutoConfiguration注解。 -@EnableAutoConfiguration导入AutoConfigurationImportSelector。-自动配置在META-INF/spring.factories文件中定义。-加载流程包括条件注解(如@Conditional)来根据环境决定是否应用配置。-排除自动配置的方法:使用exclude属性或application.properties。完整流程: 1.启动应用时,@SpringBootApplication注解被扫描。 2. @SpringBootApplication包含@EnableAutoConfiguration。 3. @EnableAutoConfiguration导入AutoConfigurationImportSelector。 4. AutoConfigurationImportSelector加载所有在META-INF/spring.factories中定义的自动配置。5.每个自动配置使用@Conditional注解来检查条件(如路径是否存在、属性设置等)。6.如果条件满足,配置被应用;否则跳过。 7.开发者可以排除特定配置。 生成相关问题:-在回答末尾添加相关问题,基于主题。 回答结构: 1.引言:简要介绍自动配置。2.核心组件:解释关键注解和。3.详细流程:逐步描述自动配置如何工作。4.排除机制:如何禁用特定自动配置。 5.示例或注意事项。 6.相关问题。使用中文回答。</think>### Spring Boot 自动配置流程详解 Spring Boot自动配置(Auto-Configuration)是其核心特性之一,它通过智能的默认配置简化了 Spring 应用的开发。自动配置基于约定优于配置的原则,在应用启动时自动检测路径、环境属性等,并据此创建和配置必要的 Bean,从而减少手动配置的负担。以下我将逐步详细解释自动配置的完整流程,确保内容清晰、可靠,并基于 Spring Boot 官方机制[^3][^4]。 #### 1. **自动配置的核心组件** 自动配置的起点是应用启动上的注解: - **@SpringBootApplication 注解**:这是主入口注解,它组合了多个注解,包括 `@SpringBootConfiguration`、`@ComponentScan` 和关键的 `@EnableAutoConfiguration`[^3]。 - **@EnableAutoConfiguration 注解**:这是触发自动配置的核心。它通过 `@Import` 导入 `AutoConfigurationImportSelector` ,该负责加载所有可用的自动配置[^3][^4]。 - **AutoConfigurationImportSelector **:这个在启动时扫描 `META-INF/spring.factories` 文件(位于 Spring Boot starter 依赖中),获取所有预定义的自动配置列表。例如,`DataSourceAutoConfiguration` 用于数据库配置[^3][^4]。 #### 2. **自动配置的详细流程** 自动配置流程在应用启动时触发,分为以下几个步骤: - **步骤 1: 启动扫描** 当应用启动时(例如,通过 `SpringApplication.run()` 方法),Spring Boot 扫描主上的 `@SpringBootApplication` 注解。这包括激活 `@EnableAutoConfiguration`,从而启动自动配置[^3]。 - **步骤 2: 加载自动配置** `AutoConfigurationImportSelector` 从路径中所有 jar 包的 `META-INF/spring.factories` 文件读取配置。该文件定义了键 `org.springframework.boot.autoconfigure.EnableAutoConfiguration` 对应的自动配置列表。例如: ```properties org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration ``` 这些是由 Spring Boot 或第三方 starter 提供的[^3][^4]。 - **步骤 3: 条件检查** 每个自动配置(如 `DataSourceAutoConfiguration`)使用 `@Conditional` 系列注解(例如 `@ConditionalOnClass`、`@ConditionalOnProperty`)来检查运行时条件: - 如果路径中存在特定(如 `DataSource.class`),则应用配置。 - 如果环境属性匹配(如 `spring.datasource.url` 已设置),则创建 Bean。 - 如果条件不满足,该配置被跳过,避免不必要的 Bean 创建[^3][^4]。 这个过确保自动配置“按需激活”,提高了灵活性和效率。 - **步骤 4: Bean 注册和应用** 满足条件的配置会定义并注册 Bean 到 Spring 容器中。例如: - `DataSourceAutoConfiguration` 会自动创建 `DataSource` Bean,如果路径有 HikariCP 连接池。 - `WebMvcAutoConfiguration` 会自动配置 Spring MVC 的组件,如视图解析器。 最终,这些 Bean 被注入到应用中,开发者无需手动编写 XML 或 Java 配置[^1][^4]。 - **步骤 5: 开发者覆盖** 自动配置不是强制性的。开发者可以通过以下方式自定义或覆盖: - 在 `application.properties` 或 `application.yml` 中设置属性(如 `spring.datasource.url`)。 - 定义自己的 `@Bean` 方法,它会优先于自动配置。 - 排除特定自动配置(见下文排除机制)[^1][^2]。 整个流程高效且透明,通常在毫秒级完成,大大提升了开发效率。例如,添加 `spring-boot-starter-web` 依赖后,Spring Boot自动配置嵌入式 Tomcat 和 MVC,开发者只需关注业务代码[^1][^3]。 #### 3. **排除自动配置的机制** 如果某些自动配置不适用(如不需要数据库),可以通过以下方式排除: - **注解排除**:在 `@SpringBootApplication` 中使用 `exclude` 属性。 ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class MyApplication { ... } ``` - **配置排除**:在 `application.properties` 中设置。 ```properties spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration ``` 这确保了自动配置的可控性[^2]。 #### 注意事项 - **条件注解的重要性**:自动配置依赖于 `@Conditional` 注解,如果路径或属性不匹配,配置不会生效,避免了资源浪费。 - **性能影响**:启动时扫描 `spring.factories` 和条件检查会增加少量开销,但通常可忽略不计。优化方法包括减少不必要的 starter 依赖[^3][^4]。 - **示例代码参考**:一个简单Spring Boot 应用启动后,自动配置的 Bean 可以在日志中查看(设置 `logging.level.org.springframework=DEBUG`)[^1]。 总之,Spring Boot自动配置通过智能约定简化了开发,其流程基于注解驱动、条件检查和路径扫描,确保高效和可扩展[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值