大家好,我是猿java。
在 SpringBoot 2.x中,一个很核心的功能是自动配置(Auto-Configuration)机制,这篇文章,我们来聊一聊 Spring Boot 2.x 实现自动配置的8个宝藏技巧,希望帮助你更好地掌握SpringBoot的自动配置原理。
- 核心注解:@EnableAutoConfiguration {#1-核心注解:-EnableAutoConfiguration} ===================================================================
自动配置的启用主要通过 @EnableAutoConfiguration
注解实现,通常,这个注解被包含在 @SpringBootApplication
中:
|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
|
@SpringBootApplication
等同于组合了以下三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
- 自动配置类的注册:spring.factories {#2-自动配置类的注册:spring-factories} ===========================================================
Spring Boot 使用 spring.factories
文件(位于各个自动配置模块的 META-INF
目录下)来注册所有的自动配置类。具体来说,@EnableAutoConfiguration
注解会触发 AutoConfigurationImportSelector
,它会读取 spring.factories
文件中 org.springframework.boot.autoconfigure.EnableAutoConfiguration
键对应的所有自动配置类,并将其导入到应用上下文中。
示例 spring.factories
内容:
|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3
| org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.autoconfig.MyAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
|
- 条件装配:@Conditional 注解 {#3-条件装配:-Conditional-注解} =================================================
自动配置类通常使用各种 @Conditional
注解来决定是否应用特定的配置。这些条件基于类路径中的类、存在的 Bean、配置属性等。常见的条件注解包括:
@ConditionalOnClass
: 当指定的类存在于类路径上时生效。@ConditionalOnMissingBean
: 当指定的 Bean 不存在时生效。@ConditionalOnProperty
: 当特定的配置属性满足条件时生效。@ConditionalOnBean
: 当指定的 Bean 存在时生效。
示例:
|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10
| @Configuration @ConditionalOnClass(DataSource.class) @ConditionalOnMissingBean(DataSource.class) public class DataSourceAutoConfiguration { @Bean public DataSource dataSource() { // 创建并返回默认的数据源 } }
|
上述配置表示:如果 DataSource
类在类路径中存在,并且上下文中尚未定义 DataSource
Bean,则自动配置一个默认的数据源。
- 自动配置的优先级与覆盖 {#4-自动配置的优先级与覆盖} ===============================
虽然自动配置会根据条件自动配置很多 Bean,但开发者可以通过以下方式覆盖默认配置:
-
自定义 Bean:如果开发者在上下文中定义了某个 Bean,而自动配置类又尝试定义同类型的 Bean,通常开发者自定义的 Bean 会优先于自动配置的 Bean。
-
排除自动配置 :可以在
@SpringBootApplication
或@EnableAutoConfiguration
注解中使用exclude
属性来排除特定的自动配置类。|-------------|--------------------------------------------------------------------------------------------------------------------| |
1 2
|@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class MyApplication { ... }
| -
配置属性 :通过在
application.properties
或application.yml
中设置特定的配置属性,可以启用、禁用或自定义自动配置的行为。
- SpringBoot Starter {#5-SpringBoot-Starter} =============================================
Spring Boot Starter 是一组依赖描述符(通常是 Maven 或 Gradle 依赖),它们聚合了一组相关的依赖项。通过引入特定的 Starter,自动配置机制会检测到相关的依赖,并根据需要应用相应的自动配置。
常见的 Starter 示例:
spring-boot-starter-web
: 包含了构建 Web 应用所需的依赖,如spring-webmvc
、Tomcat
等,并触发相关的自动配置(如DispatcherServlet
、Tomcat
等)。spring-boot-starter-data-jpa
: 包含了 JPA 相关的依赖,并触发数据源、JPA 实体管理器等的自动配置。
- AutoConfigurationImportSelector 与组装自动配置 {#6-AutoConfigurationImportSelector-与组装自动配置} =======================================================================================
AutoConfigurationImportSelector
是 @EnableAutoConfiguration
背后的关键类。它负责读取 spring.factories
文件中的自动配置类,并应用到 Spring 应用上下文中。流程如下:
-
**解析
spring.factories
**:读取所有在spring.factories
中注册的自动配置类。 -
评估条件 :对于每个自动配置类,评估其
@Conditional
注解,决定是否应用该配置。 -
导入配置类:将符合条件的自动配置类导入到应用上下文中。
-
调试与诊断自动配置 {#7-调试与诊断自动配置} ===========================
Spring Boot 提供了一些工具和特性,帮助开发者理解和调试自动配置:
-
**
spring-boot-starter-actuator
**:包含的auto-configure
端点可以展示应用的自动配置报告。 -
@EnableAutoConfiguration
的report
日志:在启动日志中显示哪些自动配置被应用或被排除。 -
spring.autoconfigure.exclude
属性:可以在配置文件中指定要排除的自动配置类。
- 自定义自动配置 {#8-自定义自动配置} =======================
作为开发者,我们也可以创建自定义的自动配置类,以便在特定条件下自动配置特定的 Bean。
下面列举了核心的 3个步骤:
-
创建自动配置类 :使用
@Configuration
和适当的@Conditional
注解。|---------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
1 2 3 4 5 6 7 8 9
|@Configuration @ConditionalOnClass(MyService.class) public class MyServiceAutoConfiguration { @Bean public MyService myService() { return new MyService(); } }
| -
在
spring.factories
中注册:|-------------|----------------------------------------------------------------------------------------------------------------------------| |
1 2
|org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.autoconfig.MyServiceAutoConfiguration
| -
发布 Starter:将自动配置类打包在一个 Starter 中,供其他项目引入使用。
通过上面 3个核心步骤,当我们在启动SpringBoot容器时,自定义的类就会被自动配置,实现我们要达到的预期。
- 总结 {#9-总结} =============
本文,我们分析了 Spring Boot 2.x 自动配置的 8个宝藏技巧,通过一系列智能的条件判断、依赖管理和配置文件支持,Spring能够根据项目的实际需求自动装配所需的组件和 Bean。这极大地简化了 Spring 应用的配置过程,使得开发者能够更专注于业务逻辑的实现,而无需关心繁琐的配置细节。
- 学习交流 {#10-学习交流} ===================