SpringBoot配置文件中List类型配置@Conditional自定义实现

在SpringBoot中,我们都习惯了@OnPropertyCondition来实现根据配置文件中的配置,来做某些逻辑的方法。

如根据配置文件中是否配置了redis,来决定是否初始化RedisConfig。

@Configuration
@ConditionalOnProperty(prefix = "spring.redis", name = "host")
public class RedisConfig {

    // do something

}

然而,当我们遇到要根据配置文件中一项List类型的配置是否配置的时候,确傻眼了,@OnPropertyCondition不支持。无论如何调试都不行。

在查阅了大量资料以后,确认了@OnPropertyCondition确实是不支持List类型配置

怎么解决呢?

自定义!!!

假设配置文件中需要配置多个redis客户端,配置如下:

redis-client:
  clients:
    - 
      name: client-1
      host: 127.0.0.1
    -
      name: client-2
      host: 127.0.0.1

那配置文件解析时,需要根据是否存在redis-client.clients配置,且存在至少1个配置项时,可以执行逻辑。 代码如下:

public class OnRedisClientsCondition extends SpringBootCondition {

    private static final Bindable<List<RedisClientProperties.Client>> CLIENT_LIST = Bindable.listOf(RedisClientProperties.Client.class);

    private static final ConditionMessage.Builder MESSAGE_BUILDER = ConditionMessage.forCondition("redis-client clients");

    private OnRedisClientsCondition() {

    }

    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String PROPERTY_NAME = "redis-client.clients";
        BindResult<?> property = Binder.get(context.getEnvironment()).bind(PROPERTY_NAME, CLIENT_LIST);
        if (property.isBound()) {
            return ConditionOutcome.match(MESSAGE_BUILDER.found("property").items(PROPERTY_NAME));
        }
        return ConditionOutcome.noMatch(MESSAGE_BUILDER.didNotFind("property").items(PROPERTY_NAME));
    }

}

使用方法如下:

@Configuration
@EnableConfigurationProperties(RedisClientProperties.class)
@Conditional(OnRedisClientsCondition.class)
public class RedisClientConfiguration {
    // do something
}

如果配置文件中没有redis-client.clients配置,或者其配置项不存在,则不会初始化RedisClientConfiguration。
相反,如果存在redis-client.clients配置,且存在至少1个配置项时,则系统会初始化RedisClientConfiguration。

问题完美解决!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值