注解篇一
1、@Conditonal注解:(https://blog.csdn.net/xcy1193068639/article/details/81491071)
按照一定条件判断,满足条件的给容器注册bean,也就是根据当前环境或者容器情况来注入bean
//此注解可以标注在类和方法上 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { Class<? extends Condition>[] value(); }
从代码中可以看到,需要传入一个Class数组,并且需要继承Condition接口:
/**
ConditionContext:调用各种方法,获取信息来看满足条件的上下文环境
AnnotatedTypeMetadata:注解所在位置的注释信息
*/
public interface Condition { boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2); }
Condition是个接口,要实现matches方法,如果返回true则注入bean,否则不注入bean。
注意点:
1.1、该接口可以在方法和类上
1.2、该接口可以传入一个类数组
当类数组中所有类返回是ture,才会注入bean。否则有一个是false都不注入。
1.3、conditionContext是springboot中ConditionalOnxxx扩展的基础
2、假设有两个bean A和B
@ConditonalOnMissingBean:
当容器中没有A这个bean,则注入B这个bean,如果有A这个bean,则不注入这个B这个Bean
@ConditionalOnBean:
当容器中没有A这个Bean时,则不注入B这个Bean,如果有A这Bean时,注入B这个Bean
这两个注解刚好作用相反