java-Spring Framework AliasFor注释难题
作者:互联网
我正在使用Spring Boot(1.3.4.RELEASE),并且对4.2中引入的新@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";
}
然后,我们注释一个简单的类,如下所示
@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());
}
我期望输出是模型,但它是视图.
根据我的理解,@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类上,但是没有明确设置其属性,因此无法以传统方式对其进行检索. Spring提供了一些实用程序类来处理诸如此类的元注释.在这种情况下,最好的选择是使用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-annotations,annotations,spring,java 来源: https://codeday.me/bug/20191027/1941465.html