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. 各部分说明

部分 说明 示例
访问修饰符 可省略不写 public、private
返回值类型 必填,不能省略不写 int、String,通用写法用*(代表所有返回值类型)
包名 支持通配符*和.. 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. 环绕通知(后置部分)
相关推荐
wshzd几秒前
LLM之Agent(104)|DeepSeek-Harness(十三)ReactLoopAgent 总览:kick → turn → step
开发语言·前端·javascript
茉莉玫瑰花茶8 分钟前
OpenGL [ 基础概念 ]
java·前端·数据库
周杰偷奶茶13 分钟前
【Java】运算符指南
java·开发语言
随性而行36015 分钟前
企业微信二次开发如何接入大模型工具?API接口实现智能任务调用的技术思路
java·前端·人工智能·python·微信·机器人·企业微信
IMPYLH24 分钟前
HTML 的 <td> 元素
前端·html
Zzzzmo_29 分钟前
Spring 原理
spring
gnip35 分钟前
Flutter GetX 三件套开发规范(Skill)
前端·flutter
温暖小土39 分钟前
Spring AI 接入 DeepSeek Chat 模型
数据库·人工智能·spring
张小姐的猫1 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt
web打印社区1 小时前
远程打印:WebSocket 与 HTTP 轮询怎么选
前端·vue.js·websocket·网络协议·http·electron·pdf