java的多重注解(重復(fù)注解)詳解
java的多重注解
本來(lái)早就寫(xiě)這一篇的,后來(lái)一直有別的事拖住了,然后就把它給忘了。前段時(shí)間看代碼時(shí),無(wú)意中看到了當(dāng)時(shí)寫(xiě)的多重注解,覺(jué)得還是有必要寫(xiě)點(diǎn)東西的,雖然不是很難,但是對(duì)沒(méi)有接觸過(guò)的來(lái)說(shuō),有一份關(guān)于它的文章總比沒(méi)有強(qiáng)。
以前也沒(méi)用到過(guò)多重注解
一次一個(gè)需求來(lái)了之后,發(fā)覺(jué)和之前的一個(gè)功能有點(diǎn)沖突,重新寫(xiě)一個(gè)方法又覺(jué)得多余,就考慮到這個(gè)多重注解上來(lái)了。但是java 7沒(méi)有多重注解相關(guān)的,只有自定義注解,后來(lái)查了資料發(fā)覺(jué)java 8 增加的新特性有多重注解,但是我們的項(xiàng)目是jdk7的,肯定沒(méi)辦法換成8的,只好自己研究了,然后花了點(diǎn)時(shí)間,查了點(diǎn)資料最后把這個(gè)問(wèn)題解決了。 下面我就針對(duì)java 7和java 8兩種不同的方式講一下這個(gè)多重注解。
在我的項(xiàng)目里的自定義注解是權(quán)限注解,用的是java 7的方法。
- 代碼如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Scope("request")
public @interface AuthValidation
{
String actionOfMenu();
String actionType();
}我需要一個(gè)多重注解
于是就想到了用容器來(lái)盛放,那不就是多重注解了嘛,所以就用了個(gè)數(shù)組存放。
- 代碼如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Scope("request")
public @interface AuthValidations
{
AuthValidation[]value();
}在實(shí)際的使用過(guò)程中也很簡(jiǎn)單
就是把原來(lái)的注解變成注解容器就好了,原來(lái)的注解是
@AuthValidation(actionOfMenu=Constant.Constant.MENU_ACTION_CASE,actionType="Constant.ACTION_TYPE_SEARCH")
修改為注解容器后,就變成
@AuthValidations({
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_INFO,actionType=Constant.ACTION_TYPE_SEARCH),
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_CFD,actionType=Constant.ACTION_TYPE_SEARCH),
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_CASE,actionType=Constant.ACTION_TYPE_SEARCH),
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_FILE,actionType=Constant.ACTION_TYPE_SEARCH)
})
public String refreshGridModel() { return super.refreshGridModel(); }在攔截器上就把之前的權(quán)限注解的驗(yàn)證,變成權(quán)限注解容器的驗(yàn)證,之前是通過(guò)反射獲取的注解,現(xiàn)在是通過(guò)反射獲取注解容器也就是注解數(shù)組,然后再遍歷驗(yàn)證就可以了。
在java 8里面,多重注解是一個(gè)新特性
也使多重注解簡(jiǎn)單很多。java 8允許我們把同一個(gè)類型的注解使用多次,只需要給該注解標(biāo)注一下@Repeatable即可。
- 代碼如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Scope("request")
@Repeatable(AuthValidations.class)
public @interface AuthValidation
{
String actionOfMenu();
String actionType();
}注解容器代碼如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Scope("request")
public @interface AuthValidations
{
AuthValidation[]value();
}只需要在自定義注解上添加@Repeatable(AuthValidations.class)即可。
在使用時(shí),也只需要重復(fù)使用就可以了,即:
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_INFO,actionType=Constant.ACTION_TYPE_SEARCH)
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_CFD,actionType=Constant.ACTION_TYPE_SEARCH)
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_CASE,actionType=Constant.ACTION_TYPE_SEARCH)
@AuthValidation(actionOfMenu=Constant.MENU_ACTION_FILE,actionType=Constant.ACTION_TYPE_SEARCH)
public String refreshGridModel() { returnsuper.refreshGridModel();}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在Java中獲取當(dāng)前年份(實(shí)例代碼)
在Java語(yǔ)言中獲取當(dāng)前年份有幾種方法:使用java.util包下的Calendar類,使用java.time包下的LocalDate類或者使用java.text包下的SimpleDateFormat類,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11
java獲取文件擴(kuò)展名的方法小結(jié)【正則與字符串截取】
這篇文章主要介紹了java獲取文件擴(kuò)展名的方法,結(jié)合實(shí)例形式分析了使用正則與字符串截取兩種獲取擴(kuò)展名的操作技巧,需要的朋友可以參考下2017-01-01
SpringMVC 跨重定向請(qǐng)求傳遞數(shù)據(jù)的方法實(shí)現(xiàn)
這篇文章主要介紹了SpringMVC 跨重定向請(qǐng)求傳遞數(shù)據(jù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java定時(shí)任務(wù)schedule和scheduleAtFixedRate的異同
本文主要介紹了Java定時(shí)任務(wù)schedule和scheduleAtFixedRate的異同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

