@Conditional条件装配是spring4引入的新特性,与@profile类似(偏向于静态激活和配置),而@Conditional关注与运行时的动态选择。API如下:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
它允许一个或多个Condition,当所有Condtion都匹配时,当前条件成立。Condition接口定义如下:
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
而matches方法中的ConditionContext包含Spring上下文相关的东西:
public interface ConditionContext {
BeanDefinitionRegistry getRegistry();
@Nullable
ConfigurableListableBeanFactory getBeanFactory();
Environment getEnvironment();
ResourceLoader getResourceLoader();
@Nullable
ClassLoader getClassLoader();
}
而AnnotatedTypeMetadata是spring4.0新加入的接口,而之前的AnnotationMetadata成为了它的子接口。
而基于spring的spring boot就有了不少的条件注解:@ConditionalOnClass @ConditionalOnBean @ConditionalOnProperty等。
接下来我们来看一个springboot的注解api
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})
public @interface ConditionalOnClass {
Class<?>[] value() default {};
String[] name() default {};
}
此时你看到了@ConditionalOnClass它是采用元标注@Conditional({OnClassCondition.class})的方式定义。这是springboot上基于它定义一个条件注解。看到这里,你可以参照它进行自定义条件注解。