深入理解注解與自定義注解的一些概念
一、注解介紹
注解就是一種標(biāo)記符號(hào),可以在代碼上的關(guān)鍵節(jié)點(diǎn)(類、方法、變量、參數(shù)、包)打上標(biāo)記,然后程序在編譯時(shí)或者運(yùn)行時(shí)就可以檢測(cè)到這些標(biāo)記從而執(zhí)行一些自己需要的功能操作。
自定義注解的步驟可以簡(jiǎn)化成三步
1、定義注解:用@Interface創(chuàng)建,并加上常用的元注解和自定義注解類型元素。
2、實(shí)現(xiàn)注解功能:編寫注解的功能,一般都是通過AOP在程序運(yùn)行時(shí)去捕獲這個(gè)標(biāo)記從而實(shí)現(xiàn)。(這步很關(guān)鍵,也是實(shí)現(xiàn)自定義注解的關(guān)鍵)
3、使用定義注解:將注解修飾/標(biāo)記到需要的程序代碼中。
通過我們最常見的一個(gè)注解來解釋這些注解概念:@Autowired,看下他的定義
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}

二、元注解
根據(jù)Autowired的定義可知道,最基本的三個(gè)元注解
@Target、@Retention、@Documented(還有一個(gè)是@Inherited也算一個(gè),但是這里Autowired沒用上,我也會(huì)介紹一下)
其中,@Target和@Retention是我們定義注解主要關(guān)注的部分,而@Documented與@Inherited是我們不很關(guān)注的元注解,我會(huì)簡(jiǎn)單提一下。
1、@Documented與@Inherited
@Documented注解,是被用來指定自定義注解是否能隨著被定義的java文件生成到JavaDoc文檔當(dāng)中。
@Inherited注解,是指定某個(gè)自定義注解如果寫在了父類的聲明部分,那么子類的聲明部分也能自動(dòng)擁有該注解。@Inherited注解只對(duì)那些@Target被定義為ElementType.TYPE的自定義注解起作用。
2、@Target
@Target注解是一個(gè)指定可以使用的范圍(類、方法、變量、參數(shù)、包)
比如上面的Autowired可以使用的范圍,CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE對(duì)應(yīng)下面的ElementType這個(gè)枚舉類,已經(jīng)有注釋說明這里不再解釋。
public enum ElementType {
/** 類,接口(包括注解類型)或枚舉的聲明 */
TYPE,
/** 屬性的聲明 */
FIELD,
/** 方法的聲明 */
METHOD,
/** 方法形式參數(shù)聲明 */
PARAMETER,
/** 構(gòu)造方法的聲明 */
CONSTRUCTOR,
/** 局部變量聲明 */
LOCAL_VARIABLE,
/** 注解類型聲明 */
ANNOTATION_TYPE,
/** 包的聲明 */
PACKAGE
}
3、@RetentionPolicy
@Retention注解是指用來修飾自定義注解的生命周期。
注解的生命周期有三個(gè)階段:1、Java源文件階段;2、編譯到class文件階段;3、運(yùn)行期階段(可以通過反射去操作目標(biāo)注解)。對(duì)應(yīng)下面的RetentionPolicy枚舉:
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
* 注釋將被編譯器丟棄
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
* 編譯器將注釋記錄在類文件中,但不需要在運(yùn)行時(shí)被VM保留。這是默認(rèn)值
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
* 編譯器將注釋記錄在類文件中,在運(yùn)行時(shí)由VM保留,因此它們可能被反射地讀取
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
三、注解類型元素
如Autowired中required就是注解類型元素

在注解中,需要聲明一個(gè)變量屬性,默認(rèn)是public,而且必須是帶()的,如required(),而且一般我們會(huì)給他加默認(rèn)值,default xx,當(dāng)不加這個(gè)參數(shù)就會(huì)以默認(rèn)值表示。比如@Autowired,那required就是true,或者你直接使用@Autowired(required = false)。
四、自定義注解
如下,自定義了一個(gè)枚舉校驗(yàn)的注解,文章最后鏈接將是走入工作中實(shí)際場(chǎng)景而自定義注解。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EnumValid {
/**
* fieldName
* @return
*/
String name() default "fieldName";
// 注解類型變量...
}
在DTO類中使用
public class ReqDTO {
@EnumValid(name = "typeName")
private String typeName;
}
具體作用文章未實(shí)現(xiàn),放在了下一篇文章。
好了,這篇文章講到這里,下一篇根據(jù)需求場(chǎng)景來給大家介紹如何實(shí)現(xiàn)自定義注解滿足我們的需求。
到此這篇關(guān)于深入理解注解與自定義注解的一些概念的文章就介紹到這了,更多相關(guān)注解與自定義注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java十大經(jīng)典排序算法的實(shí)現(xiàn)圖解
Java常見的排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。本文詳解介紹Java十大十大經(jīng)典排序算法的實(shí)現(xiàn)以及圖解,需要的可以參考一下2022-03-03
Spring aop+反射實(shí)現(xiàn)電話號(hào)加密
線上項(xiàng)目涉及大量查詢接口中,存在電話號(hào)明文展示不合規(guī)的問題。如果對(duì)每個(gè)接口返回結(jié)果中電話號(hào)相關(guān)字段修改相關(guān)代碼邏輯,則工作量較大花費(fèi)時(shí)間多。因此設(shè)計(jì)電話號(hào)加密注解,減少工作量。2021-06-06

