在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。
问题完美解决!