news 2026/3/12 11:19:49

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/3/7 23:04:09

git个人开发流程

1. 标准开发流程 (针对个人项目) 第一步:同步主分支 (保持起点最新) # 1. 切换回主分支 git checkout main# 2. 拉取远程最新代码 (防止你在这个设备开发时,在另一个设备Push过代码) git pull origin main 第二步:新建并切换分支 不要在 …

作者头像 李华
网站建设 2026/3/11 13:02:35

智能安防(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:CP-51-2021-051设计简介:本设计是基于单片机的智能安防系统,主要实现以下功能:可通过LCD1602安防状态和是否有人&#x…

作者头像 李华
网站建设 2026/3/9 4:03:09

django基于大数据旅游数据分析与推荐系统的设计与实现

前言Django基于大数据的旅游数据分析与推荐系统是一个结合了Python编程语言、Django Web框架、大数据技术以及推荐算法的综合性平台,旨在通过收集、分析和利用旅游相关的数据,为用户提供个性化的旅游推荐服务,同时为旅游企业和管理部门提供决…

作者头像 李华
网站建设 2026/3/6 19:45:40

SSH登录异常频发:除了改端口,我们还能做什么?

封不完的IP?拦不住的爆破?这四招让黑客直接绝望! 各位运维工程师、系统管理员,上面这些吐槽,是不是你们的日常?面对SSH暴||力破解,修改默认22端口就像是给家门换了一把没藏在垫子底下、但藏在花…

作者头像 李华
网站建设 2026/2/28 8:35:39

JAVA源码助力:汽车养护同城服务升级

JAVA源码可通过微服务架构、多端适配、智能调度与数据安全保障等技术手段,助力汽车养护同城服务实现高效便捷的一键触达,具体实现路径如下:一、技术架构:微服务跨平台,支撑高并发与全场景覆盖微服务拆分采用Spring Boo…

作者头像 李华
网站建设 2026/3/12 9:35:44

39-mini-vue 实现解析 text 功能

实现解析 text 功能 测试 describe("text", ()>{it("simple text",()>{const ast baseParse("some text")expect(ast.children[0]).toStrictEqual({type: NodeTypes.TEXT,content: "some text"})}) })思路: * 如果…

作者头像 李华