Spring組合註解詳解(註解合併及別名屬性覆蓋)

2021-10-07 02:42:30 字數 3172 閱讀 8340

註解的作用就不用介紹了吧,主要就是用來簡化配置,通過自定義註解或者其他框架提供的註解,只要往方法或者類上一加,就可以實現許多神奇的功能。

spring 4.2之後就提供了組合註解的實現方式,啥是組合註解呢,其實就是將多個註解作用於乙個註解,用乙個註解就可以來實現那多個註解的功能,使作用的元素(即方法或類等)看上去更簡潔美觀,當然主要還是更強大的屬性覆蓋功能。

舉個最常見的組合註解吧,即spring的@restcontroller,它將@responsebody和@controller兩個註解組合為乙個,我們在controller類上只要加@restcontroller即可實現之前要加兩個註解才能實現的功能。**如:

@target(elementtype.type)

@retention(retentionpolicy.runtime)

@documented

@controller  //組合controller使其實現bean註冊

@responsebody  //組合responsebody使其支援將結果轉化為json

public @inte***ce restcontroller

自定義註解(即自己要實現某些功能但不使用spring提供的一些註解,並非網上大部分那種將spring提供的多個註解作用於乙個自己定義的註解然後將該註解作用於元素,讓其實現spring提供的組合功能)時,想使用spring那神奇般的組合註解該如何實現呢。接下來就介紹spring神奇的工具類annotatedelementutils,使用它就可以讓自己的註解實現組合註解般的功能。直接上**:

/**

* @author meilin.huang

* @version 1.0

* @date 2019-06-06 21:11

*/public class synthesizedannotationtest )

@retention(runtime)

@inte***ce test1

@target()

@retention(runtime)

@inte***ce test2

@target()

@retention(runtime)

@test2

@inte***ce test3

/*** 只有@test3註解,但是test3註解上組合了@test2註解,故就可以通過spring的工具類獲取到test2註解的內容,詳見main方法

* 當然也可以將組合註解作用於更高層次,如test3組合test2,test2組合test1,然後將test3作用於元素,通過工具類獲取test1註解功能

*/@test3

static class element {}

public static void main(string args)

}

我們在合併註解的時候,比如註解a中有屬性a(),註解b中有屬性b(),它們的組合註解c這麼寫就可以了:

@documented

@target()

@retention(retentionpolicy.runtime)

@a@b

public @inte***ce c

如果spring只實現了以上那功能,其實作用也不太大,並且實現也就很簡單了,自己便可輕易實現,通過直接查詢元素上是否含有該直接註解,沒有則遍歷該元素其他註解,然後遞迴遍歷查詢註解的元註解是否含有該元素,直到找到返回即可。

接下來就介紹下spring組合註解更強大的屬性覆蓋功能,即更低層次的註解屬性方法覆蓋高層次註解的屬性方法,啥意思呢,具體見**就比較清晰明了了,實現該功能還需要spring提供的另外乙個註解即@aliasfor配合完成。

/**

* @author meilin.huang

* @version 1.0

* @date 2019-06-06 21:11

*/public class synthesizedannotationtest )

@retention(runtime)

@inte***ce test1

@target()

@retention(runtime)

@inte***ce test2

@target()

@retention(runtime)

@test2

@inte***ce test3

/*** 只有@test3註解,但是test3註解上組合了@test2註解,並將該註解的test3方法值用來覆蓋test2註解中的test2方法

* 即更低層次宣告的覆蓋規則,會覆蓋更高層次的屬性方法值,即呼叫高層次的註解方法值實際顯示的是低層所賦的值

* 當然也可以將組合註解作用於更高層次,如test3組合test2,test2組合test1,然後將test3作用於元素,通過工具類獲取test1註解覆蓋的屬性值

*/@test3(test3 = "覆蓋test2屬性中的test2方法")

static class element {}

public static void main(string args)

}

以上就是屬性覆蓋的最簡單兩層覆蓋,當然原則上是可以支援無限層覆蓋的,但是用法都是一致的。實現該功能的主要原理其實就是通過jdk的動態**。具體實現方式有興趣的可以參考annotatedelementutils工具類的實現細節。

那麼組合註解有啥用呢,其實個人感覺用處是非常大的可以不改變原註解的**,就可以定義新註解,並通過覆蓋原則來覆蓋原註解的一些屬性值來實現更多的其他功能擴充套件,也不會影響原註解的使用。spring的大量註解都使用這些原則,隨便翻翻原始碼註解隨處可見的都是這類組合註解。當然更多的用處還是需要根據自己的需求自己發揮啦,哈哈哈。

我參考了spring該工具類的原始碼,大大簡化了其實現方式(畢竟spring考慮的比較周到,**比較複雜),但是在能實現其最基本功能的原則上個人的實現感覺也是夠用了,且效能是spring的兩倍。具體**在本人的專案[ ]的annotationutils裡,有興趣的可以參考參考該實現方式蛤,多提寶貴意見~~~

spring組合註解的神奇實用功能詳解(功能組合以及別名屬性覆蓋)_mayfly_hml的部落格-csdn部落格

spring原始碼---組合註解/合併註解的問題_小雨的光的部落格-csdn部落格

Spring 註解詳解

使用註解來構造ioc容器 在base package指明乙個包 表明com.om包及其子包中,如果某個類的頭上帶有特定的註解 component repository service controller 就會將這個物件作為bean註冊進spring容器。1 component component是...

Spring 註解詳解

當我們的專案越來越複雜時 配置檔案也會變得複雜 這樣不僅影響開發效率 還影響錯誤查詢 因此 spring 提供了註解方式開配置bean 使用註解需要準備工作 1.匯入 spring架包 2.引入約束檔案 context檔案 3.開啟掃瞄註解 常用註解 component 給user類加上該註解就等同...

Spring 註解詳解

概述 注釋配置相對於 xml 配置具有很多的優勢 因此在很多情況下,注釋配置比 xml 配置更受歡迎,注釋配置有進一步流行的趨勢。spring 2.5 的一大增強就是引入了很多注釋類,現在您已經可以使用注釋配置完成大部分 xml 配置的功能。在這篇文章裡,我們將向您講述使用注釋進行 bean 定義和...