组合注解
使用
组合注解就是将多个注解组合到一个注解上。
比如我们在编写控制器(Controller)时,一般需要写@Controller
和@ResponseBody
,通过组合注解,我们可以写一个@RestController
就可以实现两个注解的功能了。
在使用SpringBoot时,经常能够看到这些注解的使用。
比如我们在使用@RestController
, @GetMapping
, @Service
时,通过查看它们的源码,都能够发现元注解中有一些常见的注解。
@Controller // 组合@Controller元注解
@ResponseBody // 组合@ResponseBody元注解
public @interface RestController {}
@RequestMapping(method = RequestMethod.GET) // 组合@RequestMapping元注解
public @interface GetMapping {}
值的获取
通过组合注解,我们可以很方便的自定义组合功能注解,但是我们没有办法在获取父注解时,像Java继承多态那样方便的获取到子注解的值。
比如我们的@Controller
注解是有很多参数的,通过定义了@RestController
后,是没有办法传递值到@Controller
的。
所以Spring给我们提供了一个工具类,具体操作如下:
- 在子注解定义参数,通过
@AliasFor(annotation = Controller.class)
指定参数绑定的父注解参数(参数名相同无需指定)。主要用于约束(类似于重写)
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
- 通过
AnnotatedElementUtils
工具类,即可获取父注解(携带子注解值)。
父注解 变量名称 = AnnotatedElementUtils.findMergedAnnotation(子注解.class, 父注解.class);
其实原理非常简单,就是将两个注解的值合并,具体可以查看spring官方文档 findMergedAnnotation
注解继承
注解继承的意思就是标记该注解的类,子类也同等能够继承到父类的注解。
可以通过 @Inherited
元注解实现,底层是用jdk帮我们实现的。基本会使用就行
可以看一下这篇博客: 简书-JAVA注解的继承性