news 2026/6/9 18:30:10

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/6/7 15:29:27

基于单片机的智能油烟机(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:CP-51-2021-050设计简介:本设计是基于单片机的智能油烟机系统,主要实现以下功能:可通过LCD1602显示烟雾浓度、温度、阈值…

作者头像 李华
网站建设 2026/6/8 14:25:06

CrossFormer 实现图像分类以及视觉任务的骨干网络替换 它使用交替的局部和全局注意力击...

CrossFormer 实现图像分类以及视觉任务的骨干网络替换 它使用交替的局部和全局注意力击败了 PVT 和 Swin。 全局注意力是在窗口维度上完成的,以降低复杂性,还具有跨尺度嵌入层,被证明是可以改进所有视觉转换器的通用骨干网络。 并设计了动态相…

作者头像 李华
网站建设 2026/6/8 14:58:45

基于单片机的心率脉搏设计

收藏和点赞,您的关注是我创作的动力 文章目录概要一、研究的主要内容光电传感器检测原理二、硬件设计说明3.1 总设计方案三、电路原理图四、结论概要 在我们现在的日常生活中脉搏心率测量仪器的使用已经越来越广泛了。为了使脉搏心率测量仪在简便性和精度方面有所提…

作者头像 李华
网站建设 2026/6/8 14:24:19

求求你们了,别再写满屏的 try catch 了!看如何更优雅地处理异常?

说明:本文讲得比较细,所以篇幅较长。请认真读完,希望读完后能对统一异常处理有一个清晰的认识。 01 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种…

作者头像 李华
网站建设 2026/6/8 14:57:32

基于Python的大学生就业信息推荐系统的设计与实现

前言在高等教育普及化背景下,大学生就业市场竞争日益激烈。传统就业信息获取方式存在信息过载、匹配度低、时效性差等问题,导致学生求职效率低下,企业招聘成本高昂。基于Python的大学生就业信息推荐系统通过整合多源就业数据,运用…

作者头像 李华