前言
隨着springboot的流行,註解使用的越來越多:
Java註解不僅讓我們減少了項目中XML文件,方便了維護,同時也使我們代碼更簡潔。那麼項目中我們如何自定義註解呢?
1. 內置註解
Java註解(Annotation
)又稱Java標註,是JDK5.0引入的一種註釋機制。
和Javadoc不同,Java標註可以通過反射獲取標註內容。在編譯器生成類文件時,標註可以被嵌入到字節碼中。 Java虛擬機可以保留註釋內容,在運行時可以獲取到註釋內容。當然它也支持自定義Java註釋。
Java定義了一套註釋解,共有7個,3個在java.lang
中,剩下4個在java.lang.annotation
中。
作用於代碼的註解:
@Override
:檢查該方法是否是重寫方法。如果發現其父類,或者是引用的接口中並沒有該方法時,會報編譯錯誤。@Deprecated
:標記過時方法。如果使用該方法,會報編譯警告。@SuppressWarnings
:指示編譯器去忽略註解中聲明的警告。
元註解(作用於註解的註解)
@Target
:用於描述註解的使用範圍。取值(ElementType
)有:
1.CONSTRUCTOR
:應用於構造器。
2.FIELD
:應用於字段或屬性(包括枚舉中的常量)。
3.LOCAL_VARIABLE
:應用於局部變量。
4.METHOD
:應用於方法。
5.PACKAGE
:應用於包。
6.PARAMETER
:應用於參數。
7.TYPE
:類、接口(包括註解類型) 或enum
聲明。
8.ANNOTATION_TYPE
:應用於註解類型。
9.TYPE_PARAMETER
:1.8版本新增,應用於類型變量。
10.TYPE_USE
:1.8版本新增,應用於任何使用類型的語句中(例如聲明語句、泛型和強制轉換語句中的類型)。@Inherited
:標記這個註解是繼承於哪個註解類。@Retention
:用於描述註解的生命週期。取值(RetentionPoicy
)有:
1.SOURCE
:在源文件中有效,編譯時被丟棄,不包含在類文件中。
2.CLASS
:在class文件中有效,由編譯器保留,但Java虛擬機(JVM)會忽略。
3.RUNTIME
:由JVM 加載,包含在類文件中,在運行時可以被獲取到。@Document
:表明該註解標記的元素可以被Javadoc 或類似的工具文檔化。
從 Java 7 開始,額外添加了 3 個註解:
@SafeVarargs
:Java 7 開始支持,忽略任何使用參數爲泛型變量的方法或構造函數調用產生的警告。@FunctionalInterface
:Java 8 開始支持,標識一個匿名函數或函數式接口。@Repeatable
:Java 8 開始支持,標識某註解可以在同一個聲明上使用多次。
2. 自定義註解
使用@interface
自定義註解時,自動繼承了java.lang.annotation.Annotation
接口,由編譯程序自動完成其他細節。在定義註解時,不能繼承其他的註解或接口。
@interface
用來聲明一個註解,其中的每一個方法實際上是聲明瞭一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型。
定義註解格式如下:
public @interface 註解名 {定義體}
下面是一個具體的例子:
package com.jid.java.test.annotation;
import java.lang.annotation.*;
/**
* @description: 自定義註解
* @author: jidi
* @eamil: [email protected]
* @create: 2020-04-07 21:19
**/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface OptLog {
public int optType() default 0;
public String optMessage() default "";
}
註解參數的可支持數據類型:
- 所有基本數據類型(
int
,float
,boolean
,byte
,double
,char
,long
,short
) String
類型Class
類型enum
類型Annotation
類型- 以上所有類型的數組
定義體中的參數設定,按照以下規定:
- 只能用
public
或默認(default
)這兩個訪問權修飾.例如,String value();
這裏把方法設爲default
默認類型。 - 參數成員只能用基本類型:
int
,float
,boolean
,byte
,double
,char
,long
,short
八種基本數據類型和String
,Enum
,Class
,annotations
等數據類型,以及這些類型的數組。 - 如果只有一個參數成員,最好把參數名稱設爲
value
。
註解元素的默認值:
- 註解元素必須有確定的值,要麼在定義註解的默認值中指定,要麼在使用註解時指定,非基本類型的註解元素的值不可爲
null
。 - 使用空字符串或
0
作爲默認值是一種常用的做法。
3 使用自定義註解
自定義註解跟其它框架提供的註解一樣使用,只是參數值根據實際情況確定。
@OptLog(optType = 1)
public void print() {
...
}
4. spring boot框架aop配置使用自定義註解
在spring boot框架中,使用自定義註解,步驟如下:
-
在pom文件引入aop依賴
注意:在完成了引入AOP依賴包後。AOP的默認配置屬性中,spring.aop.auto
屬性默認是開啓的,也就是說只要引入了AOP依賴後,默認已經增加了@EnableAspectJAutoProxy
,不需要在程序主類中增加@EnableAspectJAutoProxy
來啓用。 -
自定義註解
-
定義切面
-
使用註解