一、Spring Boot 自动装配机制
自动装配是 Spring Boot 的核心特性之一,它极大地简化了基于 Spring 的应用开发,减少了繁琐的 XML 配置或 Java 配置。其核心思想是"约定优于配置"(Convention Over Configuration)。
1. 核心原理:@EnableAutoConfiguration
Spring Boot 的启动类通常带有 @SpringBootApplication 注解,它是一个组合注解,包含以下关键注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中 @EnableAutoConfiguration 是开启自动装配的关键。
2. 自动配置的实现方式
-
条件化配置(Conditional) : 通过
@Conditional系列注解(如@ConditionalOnClass,@ConditionalOnMissingBean等)判断是否满足加载条件。例如:@Configuration @ConditionalOnClass(DataSource.class) public class DataSourceAutoConfiguration { @Bean @ConditionalOnMissingBean public DataSource dataSource() { // 自动配置数据源 } } -
spring.factories文件 : 在META-INF/spring.factories文件中声明需要自动加载的配置类:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyAutoConfigurationSpring Boot 启动时会扫描所有 jar 包中的该文件,并加载其中配置的类。
3. 自动装配流程
- 启动
SpringApplication - 加载
META-INF/spring.factories中的EnableAutoConfiguration列表 - 过滤掉被
@Conditional排除的配置类 - 将剩余的配置类注入 Spring 容器
二、Starter 实现原理
Starter 是 Spring Boot 生态中的重要概念,它是一个"开箱即用"的依赖模块,通常包含:
- 必要的库依赖(
pom.xml) - 自动配置类(
XXXAutoConfiguration) - 可选的附加配置(如
application.properties默认值)
1. 自定义 Starter 步骤
步骤 1:创建项目结构
my-starter
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ ├── MyService.java // 服务类
│ │ │ └── auto
│ │ │ └── MyAutoConfiguration.java // 自动配置
│ │ └── resources
│ │ └── META-INF
│ │ └── spring.factories // 注册自动配置
└── pom.xml
步骤 2:实现自动配置类
@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyService();
}
}
步骤 3:注册配置到 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.auto.MyAutoConfiguration
步骤 4:打包发布
<!-- pom.xml 示例 -->
<artifactId>my-spring-boot-starter</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
三、自动装配与 Starter 的关系
- Starter 提供依赖管理和默认配置入口
- 自动配置 基于 Starter 引入的依赖实现条件化装配
- 用户只需引入 Starter 依赖即可获得完整功能
四、示例:自定义 Starter 使用
// 用户项目中直接注入服务
@RestController
public class DemoController {
@Autowired
private MyService myService; // 自动注入 Starter 提供的 Bean
@GetMapping("/demo")
public String demo() {
return myService.execute();
}
}
总结
| 概念 | 作用 | 关键实现 |
|---|---|---|
| 自动装配 | 按条件动态加载配置 | @Conditional, spring.factories |
| Starter | 依赖聚合 + 默认配置 | pom.xml + 自动配置类 |
通过这种机制,Spring Boot 实现了"约定大于配置"的理念,开发者只需关注业务逻辑,大大提升了开发效率。