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();
}
浙公網安備 33010602011771號