Skip to content

条件注解

Spring 条件容器(Conditional Bean) 指的是: 只有在满足某些条件时,Spring 才会把 Bean 注册到 IoC 容器中。

@Conditional

原理

java
@Component
@Conditional(MyCondition.class)
public class UserService {}

Spring 会先判断 MyCondition 是否成立:

  • 成立 → 创建 Bean
  • 不成立 → 不创建 Bean
java
@Target({TYPE, METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Conditional {
    Class<? extends Condition>[] value();
}

自定义条件(MyCondition)

  • 创建条件类:实现 Condition 接口:
java
public class MyCondition implements Condition {

    @Override
    public boolean matches(
            ConditionContext context,
            AnnotatedTypeMetadata metadata) {

        return true; // true 才会注册 Bean
    }
}

返回值:

  • true → 注册 Bean
  • false → 不注册

  • 使用条件
java
@Configuration
public class AppConfig {

    @Bean
    @Conditional(MyCondition.class)
    public UserService userService() {
        return new UserService();
    }
}

常用条件注解

Spring 已经封装了大量条件注解。

@ConditionalOnProperty

根据配置文件创建 Bean。

@Bean
@ConditionalOnProperty(name="redis.enabled", havingValue="true")
public RedisService redisService() {
    return new RedisService();
}

只有配置:

redis.enabled=true

才会创建。

@ConditionalOnClass

类存在才创建。

@ConditionalOnClass(name = "redis.clients.jedis.Jedis")

如果没有 Redis 依赖,就不会创建 Redis Bean。

@ConditionalOnMissingBean

容器没有 Bean 时创建。

@Bean
@ConditionalOnMissingBean
public UserService userService() {
    return new UserService();
}
  • 用户没定义 → Spring 自动创建
  • 用户定义了 → Spring 不创建

@ConditionalOnBean

容器存在 Bean 才创建。

@ConditionalOnBean(DataSource.class)

必须有 DataSource 才创建。

@ConditionalOnMissingClass

类不存在才创建。

@ConditionalOnMissingClass("redis.clients.jedis.Jedis")

@ConditionalOnWebApplication

Web 环境才创建。

@ConditionalOnWebApplication