编程语言
首页 > 编程语言> > java-Spring Framework AliasFor注释难题

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