
子類重寫父類方法后,可以繼承方法上的注解嗎?

這個不急,讓我來分析一下,假設(shè)有如下注解:

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




