这两个注解都跟配置属性值有关,一个是用来做判断条件,一个是用来使用配置文件的属性值。
@ConditionalOnProperty
有时候我们需要根据某些配置来控制配置类是否生效,例如生成Token的实现类我们有两种实现类的Bean,一种基于redis,一种基于JDBC,我们想根据配置决定项目启动后使用的是哪一种bean,这时候我们就可以使用@ConditionalOnProperty注解来控制@bean注解是否生效
下面的代码理解为:
当配置文件中 security.oauth2.token.store前缀下的type属性为jdbc时,第一个@Bean生效;type属性为redis时,第二个@Bean生效
@Configuration
public class TokenStoreConfigNew {
@Bean
@ConditionalOnProperty(prefix="security.oauth2.token.store",name="type" ,havingValue="jdbc" ,matchIfMissing=false)
public JdbcTokenStore jdbcTokenStore(){
return new JdbcTokenStore( dataSource ) ;
}
@Bean
@ConditionalOnProperty(prefix="security.oauth2.token.store",name="type" ,havingValue="redis" ,matchIfMissing=true)
public RedisTemplateTokenStore redisTokenStore(RedisConnectionFactory connectionFactory){
Assert.state(connectionFactory != null, "connectionFactory must be provided");
RedisTemplateTokenStore redisTemplateStore = new RedisTemplateTokenStore(connectionFactory) ;
return redisTemplateStore ;
}
}
@ConfigurationProperties
在应用中要是用yml或Properties文件中定义的属性值,有很多方式。常见的就是使用@Value注解绑定值,这种对java字段和配置文件中的字段没有统一要求,但是属性太多的话比较繁琐。
我们可以使用@ConfigurationProperties注解方便快捷的把配置文件中的属性与java类中的属性做绑定。其对应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor
如下定义一个类,要求:
1类属性名称要与配置文件中的字段名字相同。
2.提供set方法。
3.使用@ConfigurationProperties注解指定配置文件属性字段前缀
4.把类定义为bean组件(添加@Component或者自己配置一个@Bean都可以),或者在使用@EnableConfigurationProperties注解扫描生效
这样就可以绑定值了。
package com.fk.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Component
@ConfigurationProperties(prefix = "Property")
public class Property {
private String id;
public void setId(String id) {
this.id = id;
}
public void getId() {
return id;
}
}