子類重寫父類方法后,可以繼承方法上的注解嗎?
這個(gè)不急,讓我來分析一下,假設(shè)有如下注解:
-
定義被注解的類
image.png -
子類直接繼承父類
image.png
-
獲取父子類和方法的注解信息,并輸出注解的value屬性的值
image.png -
日志輸出
image.png -
再看一遍控制臺(tái)信息
image.png
可見使用@Inherited只能實(shí)現(xiàn)類上的注解繼承。
那么如何實(shí)現(xiàn)方法上注解的繼承呢?
最簡(jiǎn)單暴力地,可通過反射技術(shù),在繼承鏈找到對(duì)應(yīng)方法上的注解。但這樣很麻煩,還需要考慮橋接方法。幸好Spring足夠強(qiáng)大,提供了AnnotatedElementUtils類。
對(duì)@Inherited的支持
遵循get語義的方法將遵循Java的@Inherited注解的約定,除了在本地聲明的批注(包括自定義組成的注解)優(yōu)于繼承的注解之外。相反,遵循find語義的方法將完全忽略@Inherited的存在,因?yàn)閒ind搜索算法手動(dòng)遍歷類型和方法層次結(jié)構(gòu),從而隱式支持注解繼承,而無需@Inherited。
Find V.S Get Semantics
此類中的方法使用的搜索算法遵循find或get語義。
Get 語義
僅限于搜索存在于AnnotatedElement
上的注解(即在本地聲明或繼承)或在AnnotatedElement上方的注解層次結(jié)構(gòu)中聲明的注釋。
Find 語義
更加詳盡,提供了獲取語義以及對(duì)以下內(nèi)容的支持:
- 搜索接口(如果帶注釋的元素是類)
- 搜索超類(如果帶注釋的元素是一個(gè)類)
- 解析橋接方法(如果帶注釋的元素是方法)
- 如果帶注解的元素是方法,則在接口中搜索方法
- 如果帶注解的元素是方法,則在超類中搜索方法
如下倆方法其實(shí)也很相像,有何區(qū)別呢?
findAllMergedAnnotations
Find 對(duì)應(yīng) SearchStrategy.TYPE_HIERARCHY
findMergedAnnotation方法可一次性找出父類和接口、父類方法和接口方法上的注解
getAllMergedAnnotations
Get對(duì)應(yīng) SearchStrategy.INHERITED_ANNOTATIONS
:
想想 Spring 的@Service、@Controller 等注解支持繼承嗎?
我們通常的controller類,都會(huì)使用controller注解,如果可以被繼承的話,Spring就不會(huì)只讓我們使用Controller注解了,會(huì)提供另一種方式注入Controller組件,就是繼承BaseController類。
Spring 官方對(duì)此也有回應(yīng):繼承的問題在于那些注解真的應(yīng)該應(yīng)用于特定的具體類。
作者:JavaEdge.
原文鏈接:https://blog.csdn.net/qq_33589510/article/details/118443203