相关文章推荐
魁梧的黑框眼镜  ·  33. WebSockets Support·  4 月前    · 
粗眉毛的熊猫  ·  jquery ajax向spring ...·  1 年前    · 
爱跑步的柳树  ·  Spring Cloud ...·  2 年前    · 
拉风的楼房  ·  iferror(_xlfn.ifs-掘金·  3 年前    · 
酒量小的春卷  ·  DRF + jwt + mysql ...·  3 年前    · 

@ConditionalOnMissingBean与@ConditionalOnBean

俩个作用:根据当前环境或者容器情况来动态注入bean,要配合@Bean使用
@ConditionalOnMissingBean作用:判断当前需要注入Spring容器中的bean的实现类是否已经含有,有的话不注入,没有就注入
@ConditionalOnBean作用:判断当前需要注册的bean的实现类否被spring管理,如果被管理则注入,反之不注入

@ConditionalOnMissingBean和@ConditionalOnBean

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnBean {
    Class<?>[] value() default {};
    String[] type() default {};
    Class<? extends Annotation>[] annotation() default {};
    String[] name() default {};
    SearchStrategy search() default SearchStrategy.ALL;// bean工厂层次结构中bean的一些命名搜索策略
    Class<?>[] parameterizedContainer() default {};
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnMissingBean {
    Class<?>[] value() default {};
    String[] type() default {};
    Class<?>[] ignored() default {};
    String[] ignoredType() default {};
    Class<? extends Annotation>[] annotation() default {};
    String[] name() default {};
    SearchStrategy search() default SearchStrategy.ALL;
    Class<?>[] parameterizedContainer() default {};
可以发现@ConditionalOnMissingBean@ConditionalOnBean俩个注解的动态注入条件判断类都是OnBeanCondition,并且都是基于@Conditional注解。

@Conditional具体可以去看 @Conditional注解使用与自定义验证注解 这篇文章

OnBeanCondition:

@Order(2147483647)
class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition {
	...具体内容可以看代码
OnBeanCondition没有直接实现matches方法,而是使用的FilteringSpringBootCondition的父类SpringBootCondition类中的matches方法。

demo: