Skip to content

条件注解

条件注解是 Spring 框架中用于根据特定条件决定是否注册 Bean 或应用配置的一种机制。Spring Boot 大量使用了条件注解来实现自动配置,使得应用程序可以根据环境和依赖关系自动调整其行为。以下是几种常用的条件注解及其工作原理:

1. @Conditional

这是最基础的条件注解,它允许你指定一个或多个 Condition 接口的实现类。如果这些条件被满足,则标注的方法、类或者字段会被处理(例如创建 Bean)。开发者可以自定义条件逻辑。

java
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 自定义条件逻辑
        return someCondition;
    }
}
java
@Bean
@Conditional(MyCondition.class)
public MyBean myBean() {
    return new MyBean();
}

2. @ConditionalOnProperty

这个注解基于属性文件中的值来决定是否创建 Bean。你可以指定属性的名字、是否有某个值等。

  • havingValue: 属性应具有的值。
  • matchIfMissing: 如果属性不存在时是否匹配。
java
@Bean
@ConditionalOnProperty(name = "my.property", havingValue = "true")
public MyBean myBean() {
    return new MyBean();
}

3. @ConditionalOnClass@ConditionalOnMissingClass

这两个注解根据类路径中是否存在某些类来决定是否创建 Bean。这对于依赖管理非常有用,比如当且仅当存在 Redis 依赖时才创建相关的 Bean。

java
@Bean
@ConditionalOnClass(RedisTemplate.class)
public MyRedisBean myRedisBean() {
    return new MyRedisBean();
}

4. @ConditionalOnBean@ConditionalOnMissingBean

根据上下文中是否存在指定类型的 Bean 来决定是否创建新的 Bean。这有助于避免重复创建相同功能的 Bean。

java
@Bean
@ConditionalOnMissingBean
public MyBean myBean() {
    return new MyBean();
}

5. @ConditionalOnExpression

通过 SpEL (Spring Expression Language) 表达式来评估条件。表达式的返回结果决定了 Bean 是否应该被创建。

java
@Bean
@ConditionalOnExpression("${feature.enabled:true}")
public FeatureBean featureBean() {
    return new FeatureBean();
}

6. @ConditionalOnWebApplication@ConditionalOnNotWebApplication

根据应用程序是否为 Web 应用程序来决定是否创建 Bean。这在区分 Web 和非 Web 环境时特别有用。

java
@Configuration
@ConditionalOnWebApplication
public class WebConfig {
    // Web-specific configuration
}

7. @ConditionalOnResource

只有当指定的资源存在于类路径或文件系统中时,才会创建 Bean。

java
@Bean
@ConditionalOnResource(resources = "classpath:my-config.properties")
public Properties myProperties() {
    // Load properties
}

8. @ConditionalOnJava

根据 JVM 的版本来决定是否创建 Bean。

java
@Bean
@ConditionalOnJava(JavaVersion.EIGHT)
public Java8Feature java8Feature() {
    return new Java8Feature();
}

9. @ConditionalOnSingleCandidate

确保只在一个候选 Bean 存在的情况下创建 Bean。如果存在多个候选 Bean,则不会创建该 Bean。

java
@Bean
@ConditionalOnSingleCandidate(MyInterface.class)
public MyBean myBean() {
    return new MyBean();
}

条件注解使得 Spring Boot 能够智能地适应不同的运行环境和依赖情况,而无需用户手动编写大量的条件逻辑。它们是 Spring Boot 实现“开箱即用”和“零配置”的关键因素之一。