参考:https://blog.csdn.net/yeahPeng11/article/details/120394276
https://blog.csdn.net/yeahPeng11/article/details/120330630
https://www.cnblogs.com/CF1314/p/16580232.html
通过现有注解,明白注解是什么东东。
在 SpringBoot中,我们会用到返回值@ResponseBody注解。@ResponseBody返回的是字符串类型数据。
@Target(ElementType.METHOD) //作用于方法上
@Retention(RetentionPolicy.RUNTIME) //作用在运行时
@Documented //生成到文档里
public @interface ResponseBody {
String value();
}
元注解
用于定义注解的注解,包括@Target、@Retention、@Documented、@Inherited。
@Target(目标)
Target意为 目标,指定定义的注解起作用的场景。限定注解的使用场景、使用对象等,注解的使用变得十分明确。它的取值由ElementType类提供。
ElementType.TYPE :作用于类、接口(包括注解类型接口)或者枚举类型。
ElementType.FIELD:作用于字段属性。
ElementType.METHOD:作用于方法。
ElementType.PARAMETER:作用于参数。
ElementType.CONSTRUCTOR:作用于构造器。
ElementType.LOCAL_VARIABLE:作用于局部变量。
ElementType.ANNOTATION_TYPE:作用于注解。
ElementType.PACKAGE:作用于包。
ElementType.TYPE_PARAMETER:作用于类型参数(since jdk1.8)。
ElementType.TYPE_USE:作用于使用的类型(since jdk1.8)。
ElementType.MODULE:作用于模块声明(since jdk9)。
在@ResponseBody中,ElementType.METHOD 代表作用在方法上。
@Retention(保留)
Retention意为 保留,解释这个注解的保留的时间(存活的时间)。它的取值由RetentionPolicy类提供。
RetentionPolicy.SOURCE:注解只在源码阶段保留,将被编译器丢弃。
RetentionPolicy.CLASS:默认行为,注解只被保留到编译进行的时候,不会被加载到 JVM 中。
RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,程序运行时可读取,可被反射读取到。
Java代码保留(存活)的时间段分为 source -> class -> runtime 三个。
@ResponseBody 注解中,@Retention(RetentionPolicy.RUNTIME) 代表作用在运行时。
@Documented(文档)
Documented意为 文档,解释此注解可以生成在 Javadoc 中。
**@**Inherited(继承)
该注解使父类的注解能被其子类继承
@Repeatable(可重复)
Repeatable意为 可重复,jdk1.8新特性。它表示修饰的注解可以重复被使用。
例如,在Controller类中,我们无法对一个类或方法增加多个 @RequestMapping 注解,会报错 does not have a valid java.lang.annotation.Repeatable annotation,但也有注解,比如 @MapperScan 和 @CompentScan 都可以在一个类和方法上重复使用,原因就是该注解用 @Repeatable 注解
注解:
@Retension(RetensionPolicy.RUNTIME)
@Target({ElementTyoe.Type})
@Documented
@Import({MapperScannerRegister.class}) // 声明是一个配置类
@Repetable(MapperScans.class)
public @interface MapperScanP{}
Java预设的注解
- @Deprecated:Deprecated意为 弃用、过时,Java语言在不断的迭代中,针对同一需求不断的优化解决方案,旧的解决方案就会使用@Deprecated标记过时,但是还是可以正常使用。
- @Override:重写父类方法需要使用@Override。
- @SuppressWarnings:阻止警告。
- @SafeVarargs:参数安全类型注解。
- @FunctionalInterface:函数式接口注解,这个是 Java 1.8 版本引入的新特性
Java内建注解
Java提供了三种内建注解。
-
@Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
-
@Deprecated——当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。Java在javadoc 中推荐使用该注解,我们应该提供为什么该方法不推荐使用以及替代的方法。
-
@SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)并且被编译器丢弃。
问题:
为什么 @GetMapping 注解请求是 Get请求,为什么@RequestMapping 指定请求类型需要用 RequestMethod.POST。
答疑:
首先通过查看 @GetMapping 的源码
@Target({ElementType.METHOD})
@Retention(RetrntionPolicy.RUNTIME)
@Documented
@RequestMapping(
method = {RequestMethod.GET}
)
public @interface GetMapping{}
从源码中可以看到,@GetMapping引用了注解@RequestMapping,同时含有参数RequestMethod.GET。@RequestMapping注解中的RequestMethod枚举,也就表明了请求类型的方式。