java的多重注解(重复注解)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wal1314520/article/details/80269389

      本来早就写这一篇的,后来一直有别的事拖住了,然后就把它给忘了。前段时间看代码时,无意中看到了当时写的多重注解,觉得还是有必要写点东西的,虽然不是很难,但是对没有接触过的来说,有一份关于它的文章总比没有强。

      以前也没用到过多重注解,一次一个需求来了之后,发觉和之前的一个功能有点冲突,重新写一个方法又觉得多余,就考虑到这个多重注解上来了。但是java 7没有多重注解相关的,只有自定义注解,后来查了资料发觉java 8 增加的新特性有多重注解,但是我们的项目是jdk7的,肯定没办法换成8的,只好自己研究了,然后花了点时间,查了点资料最后把这个问题解决了。       下面我就针对java 7和java 8两种不同的方式讲一下这个多重注解。

      在我的项目里的自定义注解是权限注解,用的是java 7的方法。代码如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Scope("request")
public @interface AuthValidation
{
         String actionOfMenu();
         String actionType();
}

      但是我需要一个多重注解,于是就想到了用容器来盛放,那不就是多重注解了嘛,所以就用了个数组存放。代码如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Scope("request")
public @interface AuthValidations
{
         AuthValidation[]value();
}

      在实际的使用过程中也很简单,就是把原来的注解变成注解容器就好了,原来的注解是

@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(); }

      在拦截器上就把之前的权限注解的验证,变成权限注解容器的验证,之前是通过反射获取的注解,现在是通过反射获取注解容器也就是注解数组,然后再遍历验证就可以了。

      在java 8里面,多重注解是一个新特性,也使多重注解简单很多。java 8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@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)即可。

      在使用时,也只需要重复使用就可以了,即:

@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();}

当然我的方法也仅供参考,希望大家有更好的方法也告诉我一声。


猜你喜欢

转载自blog.csdn.net/wal1314520/article/details/80269389