springboot~ConditionalOnProperty注解的使用
@ConditionalOnProperty注释在类或者bean方法上进行控制这个bean对象是否被注册,它是否被注册,完成依赖于ConditionalOnProperty里的value的值,为true时,表示被注册,为false表示不注册这个bean。而我们通过matchIfMissing来配置这个value的缺省值,默认是false,即当你不配置时,它是不会自动装配的。
在组件中的使用
一 声明一个配置类
@ConfigurationProperties("kc-kafka")
@Data
public class KafkaProperties {
/**
* 是否开启kafka功能.
*/
private Boolean enabled = true;
/**
* kafka生产者ack机制
*/
private String acks = "1";
通过EnableConfigurationProperties开启配置类,而当前类是否被注册,依赖于kc-kafka.enabled的值,默认是装配这个bean
matchIfMissing=true表示默认在不配置kc-kafak时,它就会装配这个KafkaProviderConfig对象
@Configuration
@RequiredArgsConstructor
@ConditionalOnProperty(value = "kc-kafka.enabled", matchIfMissing = true)
@EnableConfigurationProperties(KafkaProperties.class)
public class KafkaProviderConfig {
@Autowired
KafkaProperties kafkaProperties;
@Bean
@ConditionalOnBean(DefaultKafkaProducerFactory.class)
public KafkaTemplate<String, String> kafkaTemplate(DefaultKafkaProducerFactory<String, String> kafkaProducerFactory) {
return new KafkaTemplate<>(kafkaProducerFactory, false);
}
}
通过name和havingValue为控制bean的装配
上面的matchIfMissing只控制boolean类型的属性,如果你希望通过字符串属性来控制bean的装配,可以使用name和havingValue的组合。
@Configuration
@RequiredArgsConstructor
@ConditionalOnProperty(name= "kc-kafka.status", havingValue="1")
@EnableConfigurationProperties(KafkaProperties.class)
@ConditionalOnProperty和@ConditionalOnMissingBean一起使用的效果
- MissingBean是一个接口,里面有个方法hello()
- 有个默认的实现DefaultMissingBean,通过@ConditionalOnMissingBean进行声明,当没有其它MissingBean接口的bean时,会使用这个DefaultMissingBean
- V1MissingBean是我们自定义的实现,它通过@ConditionalOnProperty来开启是否装配,如果它没有装备,spring就使用默认的DefaultMissingBean
- test.v1.enabled在配置文件里,配置为true表示开启 V1MissingBean,配置为false,表示不开启它,而开启默认的DefaultMissingBean
实例代码
public interface MissingBean {
void hello();
}
public class DefaultMissingBean implements MissingBean {
@Override
public void hello() {
System.out.println("default MissingBean");
}
}
@Configuration
public class MissingBeanConfig {
/**
* @ConditionalOnMissingBean当没有其它MissingBean的bean时,就使用DefaultMissingBean这个bean. @return
*/
@Bean
@ConditionalOnMissingBean(MissingBean.class)
public MissingBean defaultMissingBean() {
return new DefaultMissingBean();
}
}
- v1MissingBean对象
@Component
@ConditionalOnProperty(value="test.v1.enabled",matchIfMissing = true)
public class V1MissingBean implements MissingBean {
@Override
public void hello() {
System.out.println("v1 MissingBean");
}
}
- 关闭v1的配置
test:
v1:
enabled: false
- 测试用例
@Autowired
MissingBean missingBean;
/**
* @ConditionalOnMissingBean.
*/
@Test
public void onMissingBean() {
missingBean.hello();
}