05.2 — 条件注解与定制 Starter
条件注解是 Spring Boot 自动配置的"开关"机制,Starter 是自动配置的"开箱即用"载体。
← 返回 **Spring Boot 索引**
1. 条件注解体系
| 条件注解 | 说明 | 示例 |
|---|---|---|
@ConditionalOnClass | 类路径存在指定类 | @ConditionalOnClass(DataSource.class) |
@ConditionalOnMissingClass | 类路径不存在指定类 | 回退配置 |
@ConditionalOnBean | 容器中有指定 Bean | 依赖其他自动配置 |
@ConditionalOnMissingBean | 容器中没有指定 Bean | 默认实现 |
@ConditionalOnProperty | 配置项存在/等于某值 | 开关控制 |
@ConditionalOnResource | 资源文件存在 | 类路径文件检查 |
@ConditionalOnWebApplication | 当前是 Web 应用 | Web 相关配置 |
@ConditionalOnNotWebApplication | 当前不是 Web 应用 | 非 Web 配置 |
@ConditionalOnExpression | SpEL 表达式为 true | 复杂条件 |
@ConditionalOnSingleCandidate | 指定 Bean 只有一个候选 | 自动配置熔断 |
@ConditionalOnJava | Java 版本匹配 | 版本适配 |
条件注解组合示例
java
@Configuration
// H2 数据库在类路径上,且用户没有自定义 DataSource Bean
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource")
public class HikariDataSourceConfiguration {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}2. 定制 Starter
Starter 命名规范
| 场景 | 命名 | 示例 |
|---|---|---|
| 官方 | spring-boot-starter-{name} | spring-boot-starter-web |
| 三方 | {name}-spring-boot-starter | mybatis-spring-boot-starter |
| 内部 | {project}-spring-boot-starter | company-sso-spring-boot-starter |
手动创建 Starter 步骤
java
// 1. 自动配置类
@Configuration
@ConditionalOnClass(SmsSender.class)
@EnableConfigurationProperties(SmsProperties.class)
public class SmsAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SmsSender smsSender(SmsProperties properties) {
return new SmsSender(properties.getApiKey(), properties.getApiSecret());
}
}
// 2. 属性类
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
private String apiKey;
private String apiSecret;
// getters & setters
}
// 3. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
// com.example.sms.SmsAutoConfiguration
// 4. spring.factories (可选,用于 Spring Boot 2.7 之前兼容)
// org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
// com.example.sms.SmsAutoConfiguration使用自定义 Starter
yaml
# application.yml
sms:
api-key: your-key
api-secret: your-secret常见面试题
- 条件注解的执行顺序?编写自定义 Starter 需要考虑什么?
- @ConditionalOnMissingBean 和 @ConditionalOnBean 的区别和使用场景?
← 返回 **Spring Boot 索引**