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> 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。

问题完美解决!

你可能感兴趣的:(1024程序员节,spring,boot,自动化配置)