Skip to content

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 配置
@ConditionalOnExpressionSpEL 表达式为 true复杂条件
@ConditionalOnSingleCandidate指定 Bean 只有一个候选自动配置熔断
@ConditionalOnJavaJava 版本匹配版本适配

条件注解组合示例

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-startermybatis-spring-boot-starter
内部{project}-spring-boot-startercompany-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

常见面试题

  1. 条件注解的执行顺序?编写自定义 Starter 需要考虑什么?
  2. @ConditionalOnMissingBean 和 @ConditionalOnBean 的区别和使用场景?

← 返回 **Spring Boot 索引**

Knowledge4J — Java 知识库