Spring 框架AliasFor注解困境
Spring Framework AliasFor annotation dilema
我正在使用 spring boot (1.3.4.RELEASE),对 4.2spring 框架中引入的新 @AliasFor 注释有疑问
考虑以下注释:
查看
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface View {
String name() default "view";
}
复合
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@View
public @interface Composite {
@AliasFor(annotation = View.class, attribute = "name")
String value() default "composite";
}
然后我们注释一个简单的class如下
@Composite(value = "model")
public class Model {
}
当运行以下代码
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
String[] beanNames = context.getBeanNamesForAnnotation(View.class);
for (String beanName : beanNames) {
View annotationOnBean = context.findAnnotationOnBean(beanName, View.class);
System.out.println(annotationOnBean.name());
}
我希望输出是 model,但它是 view。
根据我的理解,@AliasFor(除其他事项外)不应该允许您覆盖元注释的属性(在本例中为 @View)?
有人可以向我解释我做错了什么吗?
谢谢
看看 @AliasFor
的文档,您会在使用注释的要求中看到这一点:
Like with any annotation in Java, the mere presence of @AliasFor on its own will not enforce alias semantics.
因此,尝试从您的 bean 中提取 @View
注释不会按预期工作。这个注释确实存在于 bean class 上,但是它的属性没有明确设置,所以不能用传统的方式检索它们。 Spring 提供了一些实用程序 classes 用于处理元注释,例如这些。在这种情况下,最好的选择是使用 AnnotatedElementUtils:
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
String[] beanNames = context.getBeanNamesForAnnotation(View.class);
for (String beanName : beanNames) {
Object bean = context.getBean(beanName);
View annotationOnBean = AnnotatedElementUtils.findMergedAnnotation(bean, View.class);
System.out.println(annotationOnBean.name());
}
我正在使用 spring boot (1.3.4.RELEASE),对 4.2spring 框架中引入的新 @AliasFor 注释有疑问
考虑以下注释:
查看
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface View {
String name() default "view";
}
复合
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@View
public @interface Composite {
@AliasFor(annotation = View.class, attribute = "name")
String value() default "composite";
}
然后我们注释一个简单的class如下
@Composite(value = "model")
public class Model {
}
当运行以下代码
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
String[] beanNames = context.getBeanNamesForAnnotation(View.class);
for (String beanName : beanNames) {
View annotationOnBean = context.findAnnotationOnBean(beanName, View.class);
System.out.println(annotationOnBean.name());
}
我希望输出是 model,但它是 view。
根据我的理解,@AliasFor(除其他事项外)不应该允许您覆盖元注释的属性(在本例中为 @View)? 有人可以向我解释我做错了什么吗? 谢谢
看看 @AliasFor
的文档,您会在使用注释的要求中看到这一点:
Like with any annotation in Java, the mere presence of @AliasFor on its own will not enforce alias semantics.
因此,尝试从您的 bean 中提取 @View
注释不会按预期工作。这个注释确实存在于 bean class 上,但是它的属性没有明确设置,所以不能用传统的方式检索它们。 Spring 提供了一些实用程序 classes 用于处理元注释,例如这些。在这种情况下,最好的选择是使用 AnnotatedElementUtils:
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
String[] beanNames = context.getBeanNamesForAnnotation(View.class);
for (String beanName : beanNames) {
Object bean = context.getBean(beanName);
View annotationOnBean = AnnotatedElementUtils.findMergedAnnotation(bean, View.class);
System.out.println(annotationOnBean.name());
}