点击@Conditional
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { Class<? extends Condition>[] value(); }
发现此注解注入并且返回的参数是 一个继承了Condition 对象的接口的Class[] 数组
再进入 Condition 可发现
public interface Condition { boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2); }
此接口要实现mathes方法,关键就在此方法上,两个参数请注意!
@param conditionContext:判断条件能使用的上下文环境
@param annotatedTypeMetadata:注解所在位置的注释信息
conditionContext提供多种方法,具体例如,获取类加载器,当前环境信息(通过当前环境信息判断,当前系统名什么的)
最终这个方法是返回boolean的值如果实true 则代表当前标注的类,或者当前标注的方法是被允许注入到IOC容器中!!!
但是要注意这里只是说的是标注在方法体上
如果标注在类上则代表着整个类中的所有方法体都将要被判断是否允许被允许注入到容器中,
总结: 1 @Conditional 判断是否允许被注入到IOC中
2 标注到类上则代表判断类中的所有的方法是否允许都被注入到ioc中即能否被实例化
3 如果传入的是一个以上的Class 对象的话 boolean值就相当于 && 符号,都返回true才被允许,有一个false则代表整体false!!!!