【译】spring注解编程模型 (2)

例如,@ContextConfiguration从spring-test模块声明如下。

public @interface ContextConfiguration { @AliasFor(“ locations ”) String [] value()default {}; @AliasFor(“ value ”) String [] locations()default {}; // ... }

该locations属性被声明为属性的别名value ,反之亦然。因此,以下声明@ContextConfiguration是等效的。

@ContextConfiguration(“/ test-config.xml ”) public class MyTests { / * ... * / } @ContextConfiguration(value = “/ test-config.xml ”) public class MyTests { / * ... * / } @ContextConfiguration(locations = “/ test-config.xml ”) public class MyTests { / * ... * / }

类似地,从元注释中覆盖属性的组合注释可@AliasFor用于精确控制在注释层次结构中覆盖哪些属性。实际上,甚至可以为value元注释的属性声明别名。

例如,可以使用自定义属性覆盖开发组合注释,如下所示。

@ContextConfiguration public @interface MyTestConfig { @AliasFor(annotation = ContextConfiguration.class, attribute = "value") String[] xmlFiles(); // ... }

上面的示例演示了开发人员如何实现自己的自定义组合注释 ; 然而,以下表明Spring本身在许多核心Spring注释中使用了这个特性。

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @RequestMapping(method = RequestMethod.GET) public @interface GetMapping { /** * Alias for {@link RequestMapping#name}. */ @AliasFor(annotation = RequestMapping.class) String name() default ""; /** * Alias for {@link RequestMapping#value}. */ @AliasFor(annotation = RequestMapping.class) String[] value() default {}; /** * Alias for {@link RequestMapping#path}. */ @AliasFor(annotation = RequestMapping.class) String[] path() default {}; // ... } 2.Spring Composed和Spring Polyglot

Spring Composed项目是可以在在spring4.2.1和更高版本中使用的一系列组合注解。你可以在Spring MVC使用像@Get,@Post,@Put, 和@Delet这样的注解,也可以在Spring MVC REST应用中使用@GetJson,@PostJson等等注解。

如果你确信已经学习了足够深入的spring-composed例子,汲取了足够多的灵感,然后你可以为spring-Composed项目贡献出由你自定义的组合注解!

https://github.com/sbrannen/spring-composed
https://github.com/sbrannen/spring-polyglot

六、FAQ

1)可以@AliasFor与value属性一起使用@Component和@Qualifier?
最简洁的答案是:不可以。

将value在属性@Qualifier和模式注解(例如@Component,@Repository,@Controller,和任何自定义典型化注解)不能受其影响@AliasFor。原因是这些value属性的特殊处理是在@AliasFor发明之前的几年。因此,由于向后兼容性问题,根本不可能使用@AliasFor这些value属性。

七、待发掘主题

记述 注解和标注了注解和元注解的类、接口、成员方法、成员变量、参数的通用搜索算法。

如果一个注解既是以注解又是以元注解的方式标注了一个元素会发生什么呢?

一个注解标注了@Inherited(包括自定义组合注解)后,是如何对搜索算法产生影响呢?

记述 通过@AliasFor配置注解成员别名的技术原理。

如果一个成员和它的别名都声明在一个注解实例(成员和别名值相同或者不同时)中在技术上会发生什么?

较有代表性的一种情况是,一个AnnotationConfigurationException将会被抛出。

记述_组合注解_的技术原理。

记述 组合注解成员覆盖元注解成员的原理。

详细记述 查找成员的算法原理:

基于命名约定的间接覆盖(换句话说,组合注解中有明确名字和类型的成员去覆盖元注解的成员)

使用@AliasFor来直接覆盖

如果一个成员和它的众多别名中的一个在注解继承的某一层级中被重新声明了会发生什么?哪个会生效?

总之,成员变量声明时的冲突是怎么被解决的?

关注个人公众号:coder辰砂 ,目前正在慢慢的整理,前期还是基础技术部分整理

【译】spring注解编程模型

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsxdg.html