news 2026/7/19 3:37:51

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/7/15 5:10:55

学霸同款9个AI论文平台,助你轻松搞定本科生毕业论文!

学霸同款9个AI论文平台,助你轻松搞定本科生毕业论文! AI 工具助力论文写作,告别熬夜苦战 对于本科生而言,撰写毕业论文是一项既重要又棘手的任务。从选题到成稿,每一个环节都充满了挑战。而随着 AI 技术的不断发展&…

作者头像 李华
网站建设 2026/7/15 4:35:47

基于单片机的彩灯控制系统

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、研究的主要内容二、彩灯的方案设计3.1彩灯常见的工作模式3.2彩灯的设计方案以及工作原理3.2.1彩灯的设计方案3.2.2彩灯的工作原理3.4彩灯效果图 三、设计3.1 plc机型的选择3.2 程序框图 概要 随着社会经济和科…

作者头像 李华
网站建设 2026/7/15 3:23:58

基于python的智能健康检测系统设计与实现2025_v5gemqq6

前言基于Python的智能健康检测系统是一个集数据采集、分析、预警和可视化于一体的综合性健康管理平台。该系统利用Python强大的数据处理能力和丰富的机器学习库,结合可穿戴设备或医疗传感器,实现对用户健康状况的实时监测和智能分析,为用户提…

作者头像 李华
网站建设 2026/7/15 8:28:18

高效便捷JAVA汽车保养同城服务新选择

JAVA汽车保养同城服务通过跨平台协同、智能调度、数据安全保障及创新功能,为用户提供高效便捷的一键触达体验,成为同城汽车养护的新选择。 以下是具体分析: 一、技术架构:跨平台无缝衔接,支撑高并发场景 多端协同 Jav…

作者头像 李华
网站建设 2026/7/15 11:17:18

为什么 LLMs 不适合编码——第二部分

原文:towardsdatascience.com/llms-coding-software-development-artificial-intelligence-68f195bb2ad3 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6bdf5bb5eaa3bc463054d27af6866c00.png 自制图像。 在发布本系列的第…

作者头像 李华
网站建设 2026/7/16 12:17:15

去哪儿StarRocks实践

一、业务背景 去哪儿网的数据平台为了满足各业务线的看数、取数、用数需求,沉淀出多种数据产品,包括QBI看板、质检系统、即席/SQL分析、趣分析、离线圈人、实时营销等。这些数据产品依赖于多种计算引擎和数据存储来满足不同的业务场景需求。例如&#x…

作者头像 李华