Spring Condition学习

一. 介绍

Condition 是 Spring 中的一个接口,它提供了一种在 Spring 配置中基于特定条件来决定是否注册一个 bean 或者一个配置类的机制。这种机制非常灵活,允许开发者基于环境变量、系统属性、类路径资源等多种条件来动态地包含或排除配置。

需要注意的是:Spring Boot 提供了许多内置的条件注解(如 @ConditionalOnProperty、@ConditionalOnClass 等),这些注解覆盖了大多数常见的使用场景,因此在可能的情况下,应优先考虑使用它们。

二. 使用场景

  • 基于环境的配置:比如,你可能想要在开发环境中启用一个特定的 bean,而在生产环境中则禁用它;
  • 条件性依赖:如果某个类路径下存在某个特定的库,你可能想基于这个库的存在与否来注册相关的 bean;
  • 功能切换:根据某些配置或条件,启用或禁用应用中的某些功能;

Condition 接口包含了一个方法 matches(ConditionContext context, AnnotatedTypeMetadata metadata),这个方法会返回一个布尔值,表示条件是否满足,Spring 容器在注册 bean 或配置类时会调用这个方法,并根据返回值决定是否继续注册;

  • ConditionContext:提供了访问注册 bean 定义的环境(如环境变量、系统属性等)的方法;
  • AnnotatedTypeMetadata:提供了关于正在注册的 bean 或配置类的注解信息;

三. 使用示例

1、自定义 Condition 类,实现 matches();

public class EnvironmentCondition implements Condition {

    /**
     * 是否有 his 环境变量
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();

        String hisProperty = environment.getProperty("his");

        return StringUtils.isNoneEmpty(hisProperty);
    }
}

2、配合 @Conditional 注解,可以作用在 @Configuration 和 @Bean 等注解上;

Spring 容器在注册 bean 或配置类时会调用该 condition 的 matches(),并根据返回值决定是否继续注册;

@Slf4j
@Configuration
//@Conditional(EnvironmentCondition.class)
public class ConditionalConfig {

    @PostConstruct
    public void postConstruct() {
        log.info("ConditionalConfig-----");
    }

    @Bean
    @Conditional(EnvironmentCondition.class)
    public User myUser() {
        log.info("myUser-----");
        User user = new User();
        return user;
    }
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值