注解继承、组合注解

组合注解

使用

组合注解就是将多个注解组合到一个注解上。
比如我们在编写控制器(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给我们提供了一个工具类,具体操作如下:

  1. 在子注解定义参数,通过@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 "";

}
  1. 通过AnnotatedElementUtils工具类,即可获取父注解(携带子注解值)。
父注解 变量名称 = AnnotatedElementUtils.findMergedAnnotation(子注解.class, 父注解.class);

其实原理非常简单,就是将两个注解的值合并,具体可以查看spring官方文档 findMergedAnnotation

注解继承

注解继承的意思就是标记该注解的类,子类也同等能够继承到父类的注解。

可以通过 @Inherited 元注解实现,底层是用jdk帮我们实现的。基本会使用就行

可以看一下这篇博客: 简书-JAVA注解的继承性