Spring 的 @Condtional 注释带有 Java 8
Spring's @Condtional annotation with Java 8
我正在使用 @Conditional
注释并且必须提供 Condition
接口的 matches()
的实现。由于 Condition
是 FunctionalInterface
,我如何使用 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 {
}
你不希望它起作用。
我正在使用 @Conditional
注释并且必须提供 Condition
接口的 matches()
的实现。由于 Condition
是 FunctionalInterface
,我如何使用 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 {
}
你不希望它起作用。