Spring 的 @Condtional 注释带有 Java 8

Spring's @Condtional annotation with Java 8

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

@Conditional(value = MyCondition.class)

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

你不能。

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

λ

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();
    }
};

两者都是匿名 class 的 实例 而不是匿名 class 本身。没有办法真正访问匿名 classes(在反射之外,但你不能在注释中使用反射)。

在预期 class 的地方传递 lambda 就像在预期 class 的地方传递 String 一样。 IE。像这样:

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

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

你不希望它起作用。