Spring AOP 五大通知类型

一、AOP 核心概念速览

在讲通知类型之前,先快速回顾几个基础概念,帮你建立整体认知:

  • 通知(Advice):增强逻辑本身,比如日志、异常处理,也就是你要 "插入" 到目标方法前后的代码。
  • 切入点(Pointcut):定义增强逻辑要插入到哪些目标方法上,通过表达式匹配。
  • 切面(Aspect):通知 + 切入点的组合,将增强逻辑切入到切入点的过程。

二、五大通知类型详解

Spring AOP 提供了 5 种通知类型,分别对应目标方法执行的不同阶段,我们用表格和场景来帮你区分:

通知类型 执行时机 特点 典型场景
前置通知(Before) 目标方法执行之前 目标方法出现异常,也不会执行后续流程 权限校验、参数日志打印
后置通知(After-Returning) 目标方法执行成功之后 目标方法出现异常,此通知不会执行 返回值处理、成功日志记录
异常通知(After-Throwing) 目标方法执行抛出异常之后 只有方法执行失败时才会触发 异常日志记录、异常告警
最终通知(After) 目标方法执行之后(无论成功 / 失败) 类似finally,方法无论执行结果如何都会执行 资源释放(关闭流、连接)
环绕通知(Around) 目标方法执行之前和之后 功能最强,可控制目标方法是否执行、修改参数和返回值 性能监控、事务控制、全局日志

三、通知类型代码示例(XML 配置版)

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 业务Bean -->
    <bean id="loginServer" class="com.qcby.LoginServer"/>

    <!-- 切面Bean -->
    <bean id="qx" class="com.qcby.QX"/>

    <!-- AOP配置 -->
    <aop:config>
        <aop:aspect ref="qx">
<!--            &lt;!&ndash; 前置通知 &ndash;&gt;-->
<!--            <aop:before method="beforeAdvice"-->
<!--                        pointcut="execution(public void com.qcby.LoginServer.login(..))"/>-->

<!--            &lt;!&ndash; 后置通知(方法成功执行后) &ndash;&gt;-->
<!--            <aop:after-returning method="afterReturningAdvice"-->
<!--                                 pointcut="execution(public void com.qcby.LoginServer.login(..))"/>-->

<!--            &lt;!&ndash; 异常通知(方法抛出异常时) &ndash;&gt;-->
<!--            <aop:after-throwing method="afterThrowingAdvice"-->
<!--                                pointcut="execution(public void com.qcby.LoginServer.login(..))"/>-->

<!--            &lt;!&ndash; 最终通知(无论成功失败都会执行) &ndash;&gt;-->
<!--            <aop:after method="afterAdvice"-->
<!--                       pointcut="execution(public void com.qcby.LoginServer.login(..))"/>-->

            <!-- 环绕通知(前后都能控制) -->
            <aop:around method="aroundAdvice"
                        pointcut="execution(public void com.qcby.LoginServer.login(..))"/>
        </aop:aspect>
    </aop:config>

</beans>

四、切入点表达式(execution)核心语法

切入点表达式是 AOP 的核心,也是新手最容易写错的地方,这里给你讲透固定写法和注意事项。

1. 固定语法格式

复制代码
execution(访问修饰符  返回值类型  包名.类名.方法名(参数列表))

2. 各部分说明

部分 说明 示例
访问修饰符 可省略不写 publicprivate
返回值类型 必填,不能省略不写 intString,通用写法用*(代表所有返回值类型)
包名 支持通配符*.. com.qcby.* 代表 qcby 包下所有子包;com.qcby.. 代表 qcby 包及所有后代包
类名 支持通配符* *Service 代表所有以 Service 结尾的类;* 代表所有类
方法名 支持通配符* add* 代表所有以 add 开头的方法;* 代表所有方法
参数列表 必填,支持通配符 (..) 表示任意类型和个数的参数;() 表示无参数;(int, String) 表示指定类型参数

3. 常见表达式示例

复制代码
// 示例1:匹配com.qcby.service包下所有类的所有方法
execution(* com.qcby.service.*.*(..))

// 示例2:匹配com.qcby包及所有子包下,所有类的所有方法
execution(* com.qcby..*.*(..))

// 示例3:匹配com.qcby.service包下UserService类的所有方法
execution(* com.qcby.service.UserService.*(..))

// 示例4:匹配com.qcby.service包下所有以add开头的方法
execution(* com.qcby.service.*.add*(..))

// 示例5:匹配com.qcby.service包下所有无参方法
execution(* com.qcby.service.*.*())

五、AOP 执行顺序总结

当一个方法被多个通知增强时,执行顺序如下:

  1. 环绕通知(前置部分)
  2. 前置通知
  3. 目标方法执行
  4. 后置通知(方法成功时)
  5. 异常通知(方法失败时)
  6. 最终通知
  7. 环绕通知(后置部分)
相关推荐
Asmewill6 小时前
LangGraph学习笔记八(SubGraph)
前端
叶落阁主6 小时前
AntV npm 投毒复盘:一次公司私服缓存恶意包引发的账号封禁事件
前端·安全·npm
vaexu6 小时前
Android 定时提醒的终极防线:我是如何用“双保险机制”攻克后台保活的?
前端
小村儿6 小时前
连载11- Claude code 的 Agent Teams——当子 Agent 开始互相说话
前端·后端·ai编程
早睡身体真不戳6 小时前
【无标题】
java·服务器·windows
布吉岛的石头6 小时前
Java 程序员第 38 阶段:Embedding 向量缓存实战,减少重复向量化计算开销
java·缓存·embedding
Circ.6 小时前
Java 远程调用 NX 11 完整实战:参数读取、修改、STP 文件导出(附环境配置 + 源码)
java·开发语言·nx11
潍坊老登6 小时前
关于 number类型从vue端传到golang后端是float而不是int的事
前端
2401_833269306 小时前
【无标题】
java·开发语言