2016-05-09 56 views
2

我使用彈簧啓動(1.3.4.RELEASE),並有一個問題關於新@AliasFor註解推出春季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"; 
} 

然後,我們標註一個簡單的類如下

@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)屬性? 有人可以向我解釋我做錯了什麼? 謝謝

+0

我認爲你應該在代碼中使用'AnnotationUtils.synthesizeAnnotation()' – terjekid

回答

2

看看爲@AliasFor的文件,你會看到這個相當的要求使用註釋:

就像在Java任何註釋的@AliasFor上僅僅存在它自己不會執行別名語義。

因此,試圖從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()); 
}