当前位置: 首页 > news >正文

Spring面向切面编程AOP(2)

前置通知(Before Advice)

前置通知在目标方法执行之前被调用,常用于执行一些预处理逻辑,例如权限验证、参数校验等。在 Spring 配置文件中,前置通知通过<aop:before>标签进行配置,以下是一个典型的示例:

<aop:before method="yanzheng" pointcut="execution(public void com.qcby.Demo.search(..))"/>

上述配置中,method="yanzheng"指定了通知方法,即当满足pointcut定义的切入点条件时,会执行yanzheng方法。pointcut属性用于定义切入点表达式,execution(public void com.qcby.Demo.search(..))表示当com.qcby.Demo类中的search方法被调用时,触发前置通知。

最终通知(After Advice)

最终通知在目标方法执行之后被调用,无论目标方法是正常返回还是抛出异常,该通知都会执行。这种通知类型适用于资源清理、状态更新等场景。在 Spring 配置文件中,通过<aop:after>标签配置最终通知:

<aop:after method="yanzheng" pointcut="execution(public void com.qcby.Demo.search(..))"/>

即使search方法执行过程中出现异常,yanzheng方法也会被执行,确保后续的清理或记录操作能

够顺利完成。

异常通知(After-Throwing Advice)

异常通知仅在目标方法抛出异常时被调用,它允许我们在异常发生时进行特定的处理,如记录异常日志、回滚事务等。通过<aop:after-throwing>标签配置异常通知:

<aop:after-throwing method="yanzheng" pointcut="execution(public void com.qcby.Demo.search(..))"/>

search方法抛出异常,yanzheng方法会捕获异常并执行相应的处理逻辑,帮助开发者更好地管理程序运行过程中的错误情况。

后置通知(After-Returning Advice)

后置通知在目标方法正常执行完毕且返回结果后被调用,可用于记录方法执行结果、更新缓存等操作。通过<aop:after-returning>标签配置后置通知:

<aop:after-returning method="yanzheng" pointcut="execution(public void com.qcby.Demo.search(..))"/>

只有search方法成功执行并返回,yanzheng方法才会被触发,如果方法执行过程中抛出异常,后置通知不会执行。

环绕通知(Around Advice)

环绕通知是功能最强大的通知类型,它可以在目标方法执行之前和之后都执行自定义逻辑,甚至可以决定是否执行目标方法。环绕通知通过<aop:around>标签进行配置:

<aop:around method="yanzheng" pointcut="execution(public void com.qcby.Demo.search(..))"/>

在环绕通知的方法中,开发者可以使用ProceedingJoinPoint参数来调用目标方法,实现更加灵活的逻辑控制。例如,在性能监控场景中,可以在目标方法执行前记录开始时间,执行后记录结束时间并计算执行耗时。

package com.qcby;import org.aspectj.lang.ProceedingJoinPoint;public class DemoProxy {public void yanzheng(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("对name和age进行验证.....执行之前");
//        执行切入点proceedingJoinPoint.proceed();System.out.println("对name和age进行验证.....执行之后");}}

 

注解式 AOP 基础配置

要使用注解方式配置 AOP,首先需要确保以下几点:

  1. 在 Spring 配置文件中启用 AOP 自动代理:
<aop:aspectj-autoproxy/>
  1. 创建切面类并使用@Aspect注解标记
  2. 将切面类声明为 Spring Bean(使用@Component@Controller等注解)

下面是一个典型的注解式切面类示例:

package com.qcby;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Controller;@Controller
@Aspect
public class DemoProxy {// 通知方法实现
}

各种通知类型的注解实现

环绕通知(@Around)

环绕通知是功能最强大的通知类型,它允许在目标方法执行前后都添加自定义逻辑。在DemoProxy类中,环绕通知的实现如下:

@Around(value = "execution(public void com.qcby.Demo.search(..))")
public void yanzheng(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("对name和age进行验证.....执行之前");// 调用目标方法proceedingJoinPoint.proceed();System.out.println("对name和age进行验证.....执行之后");
}

关键点解析:

  • @Around注解指定了通知类型和切入点表达式
  • ProceedingJoinPoint参数用于控制目标方法的执行
  • proceed()方法调用目标方法,可以在调用前后添加自定义逻辑

 

前置通知(@Before)

前置通知在目标方法执行前被调用:

@Before(value = "execution(public void com.qcby.Demo.search(..))")
public void yanzheng() {System.out.println("对name和age进行验证!!");
}

 

后置通知(@After)

后置通知在目标方法执行后被调用,无论方法是否抛出异常:

@After(value = "execution(public void com.qcby.Demo.search(..))")
public void yanzheng() {System.out.println("后置通知执行");
}

 

异常通知(@AfterThrowing)

异常通知仅在目标方法抛出异常时被调用:

@AfterThrowing(value = "execution(public void com.qcby.Demo.search(..))")
public void yanzheng() {System.out.println("异常通知执行");
}
    //在查询之前验证name和agepublic void search(String name,int age){Integer a=10/0;System.out.println("search.................");}}

 

返回通知(@AfterReturning)

返回通知在目标方法正常返回后被调用:

@AfterReturning(value = "execution(public void com.qcby.Demo.search(..))")
public void yanzheng() {System.out.println("返回通知执行");
}

 

注解式 AOP 的优势

与 XML 配置方式相比,注解式 AOP 具有以下优势:

  1. 代码更简洁:无需编写大量 XML 配置,所有 AOP 逻辑集中在切面类中
  2. 可读性更强:通知类型和切入点表达式直接与通知方法关联
  3. 维护更方便:AOP 逻辑与切面类代码放在一起,便于修改和管理
  4. 类型安全:编译时就能检查切入点表达式的正确性

 

http://www.lqws.cn/news/471655.html

相关文章:

  • Android Studio 打 APK 包报错 Invalid keystore format 的解决方法
  • Vue3 + TypeScript 中 let data: any[] = [] 与 let data = [] 的区别
  • 【力扣 简单 C】509. 斐波那契数
  • “组学”的数据结构与概念
  • 恒流源和直流稳压电源 电路
  • 【Linux】gdb调试器
  • 蓝桥杯备赛篇(上) - 参加蓝桥杯所需要的基础能力 1(C++)
  • 偏微分方程通解求解2
  • 【RAG优化】深度解析开源项目MinerU:从PDF解析到多模态理解的工业级解决方案
  • 正则表达式与C++
  • 【Java】APi
  • rt-thread中使用usb官方自带的驱动问题记录
  • Compose笔记(二十八)--加水印
  • 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)
  • 网络基础入门:从OSI模型到TCP/IP协议详解
  • Gartner《AI-Driven Methods for Cost-Efficiency》学习心得
  • SQL Server 数据库操作
  • 大模型的开发应用(十二):RAG 与 LlamaIndex基础
  • 【论文阅读】人工智能在直升机航空电子系统中的应用
  • 随机一道面试题1:Python是解释型语言or编译型语言?
  • 算法-Day04
  • SD-WAN 不是“裸跑”:聊聊怎么把网络安全绑在智能网关上
  • 2025zbrush雕刻笔记
  • DPO直接偏好函数的学习解读
  • C语言:最大公约数
  • 以AI赋能创意未来:即梦3.0与Seedance1.0Lite重磅登陆POE!
  • 操作系统内核态和用户态--2-系统调用是什么?
  • 新手如何利用AI助手Cursor生成复杂项目
  • LINUX621 NFS 同步 ;FTP;samba环境
  • 李宏毅2025《机器学习》第三讲-AI的脑科学