轉自:https://blog.csdn.net/weixin_43993065/article/details/106740140
前言
繼@Conditional注解后,又基於此注解推出了很多派生注解,比如@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnExpression、@ConditionalOnClass…動態注入bean變得更方便了。本篇將講解@ConditionalOnMissingBean注解。
需求
做了一個功能接口提供給消費者實現,考慮到有些消費者沒有實現接口,就會導致報錯。所以需要寫一個默認實現,並且在消費者有實現接口時,采用消費者的接口。
@Configuration public class InterceptorConfig { @Bean @ConditionalOnMissingBean(IOperInfo.class) public IOperInfo iOperInfo(){ return new DefaultOperInfoImpl(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
@ConditionalOnMissingBean
就實現了這個功能,它作用在@bean定義上,就是在容器加載它作用的bean時,檢查容器中是否存在目標類型(@ConditionalOnMissingBean
注解的value值)的bean了,如果存在這跳過原始bean的默認加載動作。
注解分析
//可以標注在類和方法上 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented //使用了@Conditional注解,條件類是OnBeanCondition @Conditional({OnBeanCondition.class}) public @interface ConditionalOnMissingBean { // 需要檢查的 bean 的 class 類型。當 ApplicationContext 不包含每一個被指定的 class 時條件匹配。 Class<?>[] value() default {}; // 需要檢查的 bean 的 class 類型名稱。當 ApplicationContext 不包含每一個被指定的 class 時條件匹配。 String[] type() default {}; // 識別匹配 bean 時,可以被忽略的 bean 的 class 類型 Class<?>[] ignored() default {}; // 識別匹配 bean 時,可以被忽略的 bean 的 class 類型名稱 String[] ignoredType() default {}; // 當 ApplicationContext 不包含帶有這些注解的 bean 時條件匹配。 Class<? extends Annotation>[] annotation() default {}; // 需要檢查的 bean 的 name。當 ApplicationContext 不包含任意指定的每一個的 class 時條件匹配。 String[] name() default {}; // 搜索容器層級,當前容器,父容器 SearchStrategy search() default SearchStrategy.ALL; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
@ConditionalOnBean和@ConditionalOnMissBean、@Conditional
簡單理解就是@ConditionalOnBean
是依賴,@ConditionalOnMissBean
是排斥,@Conditional
為條件