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

 更新时间:2026年01月31日 09:15:44   作者:wal1314520  
文章主要讲述了Java中多重注解的使用,包括Java7和Java8两种方式,在Java7中,通过自定义注解容器来实现多重注解;而在Java8中,可以使用@Repeatable注解来实现多重注解,使代码更加简洁

java的多重注解

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

以前也没用到过多重注解

一次一个需求来了之后,发觉和之前的一个功能有点冲突,重新写一个方法又觉得多余,就考虑到这个多重注解上来了。但是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();}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot实现Server-Sent Events(SSE)的使用完整指南

    SpringBoot实现Server-Sent Events(SSE)的使用完整指南

    使用SpringBoot实现Server-Sent Events(SSE)可以有效处理实时数据推送需求,具有单向通信、轻量级和高实时性等优势,本文详细介绍了在SpringBoot中创建SSE端点的步骤,并通过代码示例展示了客户端如何接收数据,适用于实时通知、数据展示和在线聊天等场景
    2024-09-09
  • mybatisplus的逻辑删除过程

    mybatisplus的逻辑删除过程

    这篇文章主要介绍了mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-08-08
  • Spring Boot 配置MySQL数据库重连的操作方法

    Spring Boot 配置MySQL数据库重连的操作方法

    这篇文章主要介绍了Spring Boot 配置MySQL数据库重连的操作方法,需要的朋友可以参考下
    2018-04-04
  • 关于application.yml数据库配置方式

    关于application.yml数据库配置方式

    这篇文章主要介绍了关于application.yml数据库配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Springboot Controller接口默认自动填充业务实体参数值详解

    Springboot Controller接口默认自动填充业务实体参数值详解

    这篇文章主要介绍了Springboot Controller接口默认自动填充业务实体参数值,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Spring Boot + Redisson 分布式锁示例案例

    Spring Boot + Redisson 分布式锁示例案例

    本文提供了一个完整的SpringBoot+Redisson分布式锁示例项目结构,包括Maven依赖、配置文件、Redisson配置类、业务服务层和控制器等,通过这个示例,可以实现分布式环境下的并发控制,感兴趣的朋友一起看看吧
    2025-12-12
  • SpringBoot订单超时自动取消的三种主流实现方案

    SpringBoot订单超时自动取消的三种主流实现方案

    在电商、外卖、票务等业务中,下单后若 30 分钟未支付则自动取消是一道经典需求,实现方式既要保证 实时性,又要在 高并发 下保持 低成本、高可靠,本文基于 Spring Boot,给出 3 种生产级落地方案,并附完整代码与选型对比,需要的朋友可以参考下
    2025-07-07
  • 当事务Transactional遇见异步线程出现的坑及解决

    当事务Transactional遇见异步线程出现的坑及解决

    这篇文章主要介绍了当事务Transactional遇见异步线程出现的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 基于Spring Validation实现全局参数校验异常处理的示例详解

    基于Spring Validation实现全局参数校验异常处理的示例详解

    在 Spring Boot 项目开发中,接口参数校验是保障数据合法性的关键环节,Spring Validation 提供了便捷的参数校验能力,下面我们就来看看具体的实现方法吧
    2025-08-08
  • Java并发工具之CountDownLatch使用详解

    Java并发工具之CountDownLatch使用详解

    这篇文章主要介绍了Java并发工具之CountDownLatch使用详解,通过使用 CountDownLatch可以使当前线程阻塞,等待其他线程完成给定任务,可以类比旅游团导游要等待所有的游客到齐后才能去下一个景点,需要的朋友可以参考下
    2023-12-12

最新评论