@ConditionalOnMissingBean注解使用案例


轉自: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為條件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM