springboot之@ConditionalXxx的实现

编程

在上一篇中我们说到了条件注解的应用,在文末我们查看了@ConditionalXxx的实现。今天我们就选择其中的一个条件注解来仔细的看下里面到底是怎么实现的。我们来看下@ConditionalOnProperty的实现

@Retention(RetentionPolicy.RUNTIME)

@Target({ ElementType.TYPE, ElementType.METHOD })

@Documented

@Conditional(OnPropertyCondition.class) //主要是这里

public @interface ConditionalOnProperty {

String[] value() default {};

String prefix() default "";

String[] name() default {};

String havingValue() default "";

boolean matchIfMissing() default false;

}

我们来看一下OnPropertyCondition这个类的实现

@Order(Ordered.HIGHEST_PRECEDENCE + 40)

class OnPropertyCondition extends SpringBootCondition {

@Override

public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {

//1.获取所有的注解属性

List<AnnotationAttributes> allAnnotationAttributes = annotationAttributesFromMultiValueMap(

metadata.getAllAnnotationAttributes(ConditionalOnProperty.class.getName()));

//2.定义两个变量,一个是放入匹配的条件信息,一个是放入不匹配的条件信息

List<ConditionMessage> noMatch = new ArrayList<>();

List<ConditionMessage> match = new ArrayList<>();

//3.循环注解属性,过滤出匹配和不匹配的条件信息

for (AnnotationAttributes annotationAttributes : allAnnotationAttributes) {

ConditionOutcome outcome = determineOutcome(annotationAttributes, context.getEnvironment());

(outcome.isMatch() ? match : noMatch).add(outcome.getConditionMessage());

}

//4.返回最终的结果

if (!noMatch.isEmpty()) {

return ConditionOutcome.noMatch(ConditionMessage.of(noMatch));

}

return ConditionOutcome.match(ConditionMessage.of(match));

}

}

是不是逻辑很清晰,主要是获取@ConditionalOnProperty中的属性值,然后通过与环境上下中的变量值比较,然后返回结果。里面的细节问题就不展开讨论了。按照上面的实现,我们完全可以自己定义一个类似功能的类


自定义的实现

public class MyConditional extends SpringBootCondition {

@Override

public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {

String value = context.getEnvironment().getProperty("test.auto.login.aop");

boolean equals = "YES".equals(value);

return equals ?new ConditionOutcome(true,"加载自动注入的aop"):new ConditionOutcome(false,"不加载自动注入的aop");

}

}

是不是很简单,获取test.auto.login.aop的值是否与预期的一样,一样就自动装配否则就不装配。到这里我们就能了解整个条件注解的实现,具体的什么时候条件注解被加载的。下次再看

以上是 springboot之@ConditionalXxx的实现 的全部内容, 来源链接: utcz.com/z/515618.html

回到顶部