news 2026/4/18 13:47:09

Spring的自定义注解与处理器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring的自定义注解与处理器

1. 自定义注解的定义

自定义注解是 Java 中的一种元数据标记,允许在代码中添加自定义信息,并能通过反射机制进行处理。我们首先定义一个自定义注解,然后在 Spring 中使用该注解来标识需要处理的类或方法。

示例:定义一个简单的自定义注解@LogExecutionTime

java复制

@Target(ElementType.METHOD) // 该注解只用于方法上 @Retention(RetentionPolicy.RUNTIME) // 注解在运行时可用 public @interface LogExecutionTime { }
  • @Target(ElementType.METHOD):表示该注解只能应用于方法上。
  • @Retention(RetentionPolicy.RUNTIME):表示该注解会在运行时通过反射获取。

2. 自定义注解的处理器设计

自定义注解通常需要一个处理器来执行特定的操作,例如记录日志、验证权限等。在 Spring 中,我们通常使用 AOP 来处理注解,具体实现步骤如下:

  1. 定义一个切面类。
  2. 在切面类中定义一个通知方法,监听被自定义注解标注的方法。
  3. 使用 Spring AOP 来处理注解的逻辑。
示例:定义一个处理@LogExecutionTime注解的切面

java复制

@Aspect @Component public class LogExecutionTimeAspect { @Around("@annotation(LogExecutionTime)") // 通过注解进行方法拦截 public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); // 记录方法执行前的时间 Object result = joinPoint.proceed(); // 执行目标方法 long end = System.currentTimeMillis(); // 记录方法执行后的时间 // 输出方法执行时间 System.out.println("Execution time of " + joinPoint.getSignature() + " is " + (end - start) + "ms"); return result; } }

3. 注解处理器与 AOP 配合

在 Spring 中,注解的处理通常与 AOP(面向切面编程)一起使用。Spring 会根据注解类型动态生成代理对象,拦截带有注解的目标方法,并在方法执行前后执行增强逻辑。Spring AOP 会根据注解和方法匹配来确定何时执行通知。

核心源码解析:@Around注解的工作原理

java复制

@Around("@annotation(LogExecutionTime)") // 注解拦截器的核心实现 public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); // 记录执行开始时间 Object result = joinPoint.proceed(); // 执行目标方法 long end = System.currentTimeMillis(); // 记录执行结束时间 System.out.println("Execution time of " + joinPoint.getSignature() + " is " + (end - start) + "ms"); return result; }
  • joinPoint.proceed():表示调用目标方法。ProceedingJoinPointJoinPoint的子类,支持方法的继续执行。

4. 启动 Spring AOP 的配置

为了使 Spring 能够识别自定义注解并使用切面进行处理,需要确保 AOP 功能已经启用。Spring 提供了两种启用 AOP 的方式:

  1. 使用 XML 配置文件。
  2. 使用注解@EnableAspectJAutoProxy
配置 AOP 功能

java复制

@Configuration @EnableAspectJAutoProxy public class AopConfig { }

5. 自定义注解的处理器与 Spring 容器集成

Spring 容器负责创建所有的 Bean,包括自定义的注解处理器。为了确保自定义注解处理器能够生效,我们需要将其作为 Spring 的一个组件 (@Component) 放入 Spring 容器管理。

示例:将切面类注册为 Spring Bean

java复制

@Aspect @Component public class LogExecutionTimeAspect { // 切面逻辑 }

6. 注解处理器的执行顺序

Spring AOP 会在执行目标方法之前和之后进行插入。处理器的执行顺序和 Spring AOP 的代理顺序密切相关。如果有多个@Aspect注解的切面类,Spring 会根据配置的顺序来决定它们的执行顺序。

  • 如果使用了@Order注解,还可以指定处理器的优先级。
  • 默认情况下,AOP 的执行顺序是按照 Spring Bean 的加载顺序来执行。
示例:通过@Order控制切面的执行顺序

java复制

@Aspect @Order(1) @Component public class LogExecutionTimeAspect { // 切面逻辑 } @Aspect @Order(2) @Component public class AnotherAspect { // 其他切面逻辑 }

7. 综合示例:使用自定义注解与处理器

下面是一个完整的示例,演示如何创建自定义注解和处理器,并在 Spring Boot 项目中进行集成。

自定义注解定义

java复制

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LogExecutionTime { }
AOP 切面定义

java复制

@Aspect @Component public class LogExecutionTimeAspect { @Around("@annotation(LogExecutionTime)") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); Object result = joinPoint.proceed(); long end = System.currentTimeMillis(); System.out.println("Execution time of " + joinPoint.getSignature() + " is " + (end - start) + "ms"); return result; } }
应用实例

java复制

@Service public class MyService { @LogExecutionTime public String doSomething() { // 模拟业务逻辑 try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return "Done"; } }

总结

通过自定义注解和 Spring AOP 的结合,可以实现灵活的代码增强功能,而无需修改业务逻辑代码。这种方式特别适用于日志记录、权限校验、性能监控等横切关注点的处理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:02:50

基于单片机的酒精监测系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 概要 一、总方案设计2.1 分析2.2 酒精浓度监测系统方案 二、硬件设计报警电路 三、系统电路设计4.2 主程序框图 四、 总结 概要 近年来,车祸惨案频频发…

作者头像 李华
网站建设 2026/4/18 5:31:15

NLIS01控制器模块

NLIS01 控制器模块简介NLIS01 控制器模块用于工业控制系统中,负责执行控制逻辑、处理现场数据,并协调各功能模块的运行。作为系统核心控制单元,负责逻辑运算与控制决策支持多种控制策略,满足不同工艺需求数据处理速度快&#xff0…

作者头像 李华
网站建设 2026/4/18 10:04:22

NMF01印刷电路板

NMF01 印刷电路板简介NMF01 印刷电路板用于工业控制系统中,为各功能模块提供稳定的电气连接和信号传输基础。作为系统内部的重要电路载体,承担信号与电源连接线路布局合理,确保信号传输稳定支持多种功能模块的电气连接需求采用工业级材料&…

作者头像 李华
网站建设 2026/4/18 8:07:56

基于spark+hadoop+python热门旅游景点推荐系统 协同过滤推荐算法

1、项目介绍 该项目是一个基于Python技术栈的旅游景点推荐与信息管理平台,旨在为用户提供个性化旅游参考服务。平台以去哪儿旅游网站为数据来源,通过requests爬虫技术批量采集景点基础信息(如名称、地址、评分、简介等)、用户评论…

作者头像 李华
网站建设 2026/4/18 8:09:47

从手动交易到量化转型_一个传统交易员的真实经历

免责声明:本文为个人经验分享,仅供技术交流,不构成任何投资建议。文中提及的工具请自行评估是否适合。 一、引子 二十年前我开始做程序化交易的时候,国内能用的工具屈指可数。如今选择多了,但选对工具反而成了一门学问…

作者头像 李华
网站建设 2026/4/18 6:59:46

python基于深度学习的个性化携程美食数据推荐系统_d7fq1jtw

前言   基于深度学习的个性化携程美食数据推荐系统是一个结合大数据、人工智能与Web技术,为用户提供精准美食推荐服务的智能化平台。该系统以携程平台积累的海量美食数据为基础,通过深度学习算法挖掘用户行为与美食特征之间的复杂关系,实现…

作者头像 李华