天天看點

【進階之路】自定義注解介紹與實戰

在使用spring架構的時候,我們經常會感歎注解式程式設計真是大大簡化了開發的時間,幾個小小的注解,就能解決一系列的配置問題,讓寫代碼像寫詩一樣輕松明快。

我們都知道,在spring架構的前期,大多使用XML配置進行開發。XML配置起來有時候冗長,如實體類的映射,使用XML進行開發會顯得十分複雜。同時注解在處理一些不變的中繼資料時有時候比XML友善的多,比如spring 聲明式事務管理,如果用XML寫的代碼會多的多。注解與Java Bean緊密結合,既大大減少了配置檔案的體積,又增加了Java Bean的可讀性與内聚性。

當然,不管使用注解還是XML,滿足需求的前提下,采用最簡單的方法才是最合适的。

今天我就以一個簡單的例子來給大家講解,如何進行自定義注解,幫助我們使用注解開發項目。

首先,我們定義一個類需要用到元注解。

@Target注解,是專門用來限定某個自定義注解能夠被應用在哪些Java元素上面的。它使用一個枚舉類型定義如下:

就像我們之前定義的,@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD,ElementType.TYPE})就是可以運用在注解、方法和類上。

@Retention注解,翻譯為持久力、保持力。即用來修飾自定義注解的生命力。

注解的生命周期有三個階段:

1、Java源檔案階段;

2、編譯到.class檔案階段;

3、運作期階段。

我們使用的@Retention(RetentionPolicy.RUNTIME) 是讓注解将被編譯器記錄在.class檔案中,而且在運作時會被虛拟機保留,是以它能通過反射被讀取到。

在注解上使用@Inherited 表示該注解會被子類繼承,注意,僅針對類,成員屬性、方法并不受此注釋的影響。

對于類來說,子類要繼承父類的注解需要該注解被 @Inherited 辨別。

對于成員屬性和方法來說,非重寫的都會保持和父類一樣的注解,而被實作的抽象方法,被重寫的方法都不會有父類的注解。

當@NotifyMonitor注解加在某個類A上時,假如類B繼承了A,則B也會帶上該注解。

我們可以看到,在springboot,很多類也加上了這個注解。

【進階之路】自定義注解介紹與實戰
【進階之路】自定義注解介紹與實戰

除了我們在注解類上應用到的之外,@Documented注解的作用是在使用 javadoc 工具為類生成幫助文檔時保留其注解資訊。

如果去掉了這個注解,那麼在生成的工具文檔上就不會出現這個注解,對于一些内部工具類注解來說可有無可。

我們來實作下面這個場景,執行一個任務,如果任務報錯,我們就通過釘釘通知指定的人員讓他進行處理。

要實作這個功能,我們可能會想到try-catch方式。當然,沒有什麼不對,但是如果要在一百個不同的方法中加入這個邏輯,豈不是要實作100次?于是乎,使用自定義注解的方式或許是不錯的主意。

我寫了一個類來實作上訴方法:

我們測試一下

1、在方法上加上注解@NotifyMonitor

【進階之路】自定義注解介紹與實戰

2、調用方法

【進階之路】自定義注解介紹與實戰

3、執行成功

【進階之路】自定義注解介紹與實戰

我們還可以嘗試一下,在@NotifyMonitor加上value(因為隻有一個屬性,是以value="xxx" 與 "xxx" 等價)

【進階之路】自定義注解介紹與實戰
【進階之路】自定義注解介紹與實戰

4、執行結果

【進階之路】自定義注解介紹與實戰

這樣,一個注解式的任務處理、通知功能就完成了。自定義注解不僅能夠在方法執行前後進行擴充、擷取到實作注解的方法、所在類等資訊、修改參數和傳回值,還能夠實作包括線程池、分布式鎖、類資料校驗等等你能想到的大部分操作,我在工作中也實作了其中一些功能,減少了大量的重複代碼,也讓代碼的可讀性提高了。

了解到這裡,不妨你也自己動手來寫一個自定義注解來簡化我們的項目吧。

大家好,我是練習java兩年半時間的南橘,下面是我的微信,需要之前的導圖或者想互相交流經驗的小夥伴可以一起互相交流哦。
【進階之路】自定義注解介紹與實戰