目录
- 什么是自动配置?
- 自动配置的核心机制
- META-INF/spring.factories 文件详解
- 条件注解 @ConditionalOnXxx
- 自定义 Starter 实践案例
- Spring Boot 2.4+ 新方式 AutoConfiguration.imports
- 总结
1. 什么是自动配置?
Spring Boot 的自动配置(Auto Configuration)是一种“开箱即用”的能力,它能根据你添加的依赖(如 Maven 或 Gradle 中引入的 jar 包),自动为你创建合适的 Bean 和配置,而无需手动编写大量配置代码。
例如:
- 引入
spring-boot-starter-web→ 自动配置 Web 环境; - 引入
spring-boot-starter-data-jpa→ 自动配置数据库连接池、JPA 支持等。
2. 自动配置的核心机制
Spring Boot 的自动配置基于以下核心机制:
| 技术 | 描述 |
|---|---|
@Configuration类 | 标记为配置类,用于注册 Bean |
条件注解(如 @ConditionalOnClass) | 控制配置是否生效 |
spring.factories文件 | 声明哪些类是自动配置类 |
| SPI(Service Provider Interface)机制 | Spring Boot 在启动时读取所有 jar 包中的 spring.factories |
3. META-INF/spring.factories 文件详解
✅ 文件位置
src/main/resources/META-INF/spring.factories
✅ 示例内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyAutoConfiguration
✅ 含义说明
当你将某个类写入 EnableAutoConfiguration 列表中后,Spring Boot 在启动时会尝试加载这个类,并根据其上的注解决定是否注入 Bean。
4. 条件注解 @ConditionalOnXxx
这些注解决定了自动配置类或 Bean 是否被加载。
常见注解列表:
| 注解 | 作用 |
|---|---|
@ConditionalOnClass | 指定类存在时才启用 |
@ConditionalOnMissingClass | 指定类不存在时才启用 |
@ConditionalOnBean | 容器中存在指定 Bean 时启用 |
@ConditionalOnMissingBean | 容器中没有指定 Bean 时启用 |
@ConditionalOnProperty | 配置文件中某属性存在且为 true 时启用 |
@ConditionalOnExpression | SpEL 表达式为 true 时启用 |
示例:
@Configuration
@ConditionalOnClass(name = "com.example.SomeExternalClass")
public class MyAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
5. 自定义 Starter 实践案例
🧱 步骤一:创建项目结构
深色版本
my-spring-boot-starter/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/starter/
│ │ ├── MyAutoConfiguration.java
│ │ └── MyService.java
│ └── resources/
│ └── META-INF/
│ └── spring.factories
└── pom.xml
📄 文件内容示例:
MyService.java
Java
深色版本
package com.example.starter;
public class MyService {
public void sayHello() {
System.out.println("Hello from MyService!");
}
}
MyAutoConfiguration.java
Java
深色版本
package com.example.starter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.MyAutoConfiguration
📦 使用 starter
在另一个 Spring Boot 项目中引入你的 starter:
<dependency>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
然后就可以直接使用 MyService:
@Autowired
private MyService myService;
@GetMapping("/hello")
public String hello() {
myService.sayHello();
return "OK";
}
6. Spring Boot 2.4+ 新方式:AutoConfiguration.imports
从 Spring Boot 2.4 开始,官方推荐使用新的方式来替代 spring.factories:
✅ 文件路径:
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
✅ 内容格式(每行一个类名):
com.example.starter.MyAutoConfiguration
这种方式更清晰、模块化更强,也更适合未来版本升级。
7. 总结
| 要点 | 内容 |
|---|---|
spring.factories是什么? | Spring Boot 的 SPI 机制,用于声明自动配置类 |
| 自动配置类会被 Spring 加载吗? | 是的,不仅加载,还会作为配置类处理并可能注入 Bean |
| 条件注解的作用? | 控制配置是否生效,实现按需加载 |
| 如何开发自己的 Starter? | 创建配置类 + 添加 spring.factories 或 AutoConfiguration.imports |
| 推荐方式? | Spring Boot 2.4+ 推荐使用 AutoConfiguration.imports 替代 spring.factories |
📚 参考资料
- Spring Boot 官方文档 - Auto-configuration
- Spring Boot 2.4 Release Notes
- Creating Your Own Auto-Configuration