參考: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枚舉,也就表明了請求類型的方式。