Java 8的Spring @Condtional批注

时间:2018-12-12 17:13:27

标签: spring java-8 spring-annotations spring-java-config

我正在使用@Conditional批注,并且必须提供matches()接口的Condition的实现。由于ConditionFunctionalInterface,我该如何使用Java 8 lambda在注释中提供实现 ,而不是提供实现。

@Conditional(value = MyCondition.class)

class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return ifMatches;
    }
}

1 个答案:

答案 0 :(得分:2)

你不能。

Lambda是类的实例,@Conditional需要类本身。

lambda

Function<String, String> capitalize = text -> text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();

在功能上与

相同
Function<String, String> capitalize = new Function<String, String>() {
    public String apply(String text) {
        return Function<String, String> capitalize = text -> text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
    }
};

都是匿名类的实例,而不是匿名类本身。无法实际访问匿名类(在反射之外,但不能在批注中使用反射)。

在期望类的地方传递lambda就像在期望类的地方传递String一样。即像这样的东西:

public @interface MyAnnotation {
    Class<?> value();
}

@MyAnnotation("this is a string")
public class MyClass {
}

您不会期望的工作。