深入理解注解與自定義注解的一些概念
一、注解介紹
注解就是一種標(biāo)記符號,可以在代碼上的關(guān)鍵節(jié)點(diǎn)(類、方法、變量、參數(shù)、包)打上標(biāo)記,然后程序在編譯時或者運(yùn)行時就可以檢測到這些標(biāo)記從而執(zhí)行一些自己需要的功能操作。
自定義注解的步驟可以簡化成三步
1、定義注解:用@Interface創(chuàng)建,并加上常用的元注解和自定義注解類型元素。
2、實(shí)現(xiàn)注解功能:編寫注解的功能,一般都是通過AOP在程序運(yùn)行時去捕獲這個標(biāo)記從而實(shí)現(xiàn)。(這步很關(guān)鍵,也是實(shí)現(xiàn)自定義注解的關(guān)鍵)
3、使用定義注解:將注解修飾/標(biāo)記到需要的程序代碼中。
通過我們最常見的一個注解來解釋這些注解概念:@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的定義可知道,最基本的三個元注解
@Target、@Retention、@Documented(還有一個是@Inherited也算一個,但是這里Autowired沒用上,我也會介紹一下)
其中,@Target和@Retention是我們定義注解主要關(guān)注的部分,而@Documented與@Inherited是我們不很關(guān)注的元注解,我會簡單提一下。
1、@Documented與@Inherited
@Documented注解,是被用來指定自定義注解是否能隨著被定義的java文件生成到JavaDoc文檔當(dāng)中。
@Inherited注解,是指定某個自定義注解如果寫在了父類的聲明部分,那么子類的聲明部分也能自動擁有該注解。@Inherited注解只對那些@Target被定義為ElementType.TYPE的自定義注解起作用。
2、@Target
@Target注解是一個指定可以使用的范圍(類、方法、變量、參數(shù)、包)
比如上面的Autowired可以使用的范圍,CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE對應(yīng)下面的ElementType這個枚舉類,已經(jīng)有注釋說明這里不再解釋。
public enum ElementType { /** 類,接口(包括注解類型)或枚舉的聲明 */ TYPE, /** 屬性的聲明 */ FIELD, /** 方法的聲明 */ METHOD, /** 方法形式參數(shù)聲明 */ PARAMETER, /** 構(gòu)造方法的聲明 */ CONSTRUCTOR, /** 局部變量聲明 */ LOCAL_VARIABLE, /** 注解類型聲明 */ ANNOTATION_TYPE, /** 包的聲明 */ PACKAGE }
3、@RetentionPolicy
@Retention注解是指用來修飾自定義注解的生命周期。
注解的生命周期有三個階段:1、Java源文件階段;2、編譯到class文件階段;3、運(yùn)行期階段(可以通過反射去操作目標(biāo)注解)。對應(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)行時被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)行時由VM保留,因此它們可能被反射地讀取 * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
三、注解類型元素
如Autowired中required就是注解類型元素
在注解中,需要聲明一個變量屬性,默認(rèn)是public,而且必須是帶()的,如required(),而且一般我們會給他加默認(rèn)值,default xx,當(dāng)不加這個參數(shù)就會以默認(rèn)值表示。比如@Autowired,那required就是true,或者你直接使用@Autowired(required = false)。
四、自定義注解
如下,自定義了一個枚舉校驗(yàn)的注解,文章最后鏈接將是走入工作中實(shí)際場景而自定義注解。
@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ù)需求場景來給大家介紹如何實(shí)現(xiàn)自定義注解滿足我們的需求。
到此這篇關(guān)于深入理解注解與自定義注解的一些概念的文章就介紹到這了,更多相關(guān)注解與自定義注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用maven整合Spring+SpringMVC+Mybatis框架詳細(xì)步驟(圖文)
這篇文章主要介紹了使用maven整合Spring+SpringMVC+Mybatis框架詳細(xì)步驟(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05java基本教程之Thread中start()和run()的區(qū)別 java多線程教程
這篇文章主要介紹了Thread中start()和run()的區(qū)別,Thread類包含start()和run()方法,它們的區(qū)別是什么?下面將對此作出解答2014-01-01spring學(xué)習(xí)之util:properties的使用
這篇文章主要介紹了spring學(xué)習(xí)之util:properties的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01