如何使用Spring框架实现AOP?

一、先明确核心概念(快速回顾)

在动手前,先理清 Spring AOP 的核心术语,避免后续代码理解混乱:

  • 切面(Aspect):封装 “横切逻辑” 的类(比如日志、权限校验、事务),是 AOP 的核心载体。
  • 切点(Pointcut):定义 “哪些方法需要被增强”(比如指定包下的所有 Service 方法)。
  • 通知(Advice):定义 “增强的时机和逻辑”,包括:
    • @Before:目标方法执行前执行
    • @After:目标方法执行后执行(无论是否异常)
    • @AfterReturning:目标方法正常返回后执行
    • @AfterThrowing:目标方法抛出异常后执行
    • @Around:环绕通知(最灵活,可控制目标方法的执行时机、参数、返回值)
  • 连接点(JoinPoint):程序执行过程中可被增强的 “点”(比如方法调用、异常抛出),Spring 只支持方法级连接点。

二、Spring AOP 实现步骤(基于注解,最常用)

Spring AOP 有两种实现方式:注解式(推荐)XML 配置式,这里重点讲注解式,步骤如下:

步骤 1:引入依赖(Maven/Gradle)

核心依赖是spring-context(已包含 AOP 基础),如果是 Spring Boot 项目,只需引入spring-boot-starter即可;非 Spring Boot 项目需手动引入:

xml

<!-- Spring核心+AOP依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.1.4</version> <!-- 适配Java 17+,按需调整版本 --> </dependency> <!-- Spring AOP增强(可选,简化切点表达式) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>6.1.4</version> </dependency>
步骤 2:开启 AOP 注解支持

在 Spring 配置类上添加@EnableAspectJAutoProxy注解,启用 AOP 自动代理:

java

运行

import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; // 配置类,开启AOP注解支持 @Configuration @ComponentScan("com.example") // 扫描指定包下的Bean @EnableAspectJAutoProxy public class SpringConfig { }
步骤 3:定义目标类(被增强的业务类)

创建普通的 Spring Bean,作为 AOP 的 “目标对象”:

java

运行

import org.springframework.stereotype.Service; // 业务层Bean,作为AOP的目标类 @Service public class UserService { // 待增强的方法1 public void addUser(String username) { System.out.println("执行添加用户逻辑:" + username); // 可手动抛出异常测试@AfterThrowing:throw new RuntimeException("添加用户失败"); } // 待增强的方法2 public String getUserById(Integer id) { System.out.println("执行查询用户逻辑:id=" + id); return "用户-" + id; } }
步骤 4:定义切面类(封装横切逻辑)

创建切面类,用@Aspect标记,同时标注为 Spring Bean(@Component),并定义切点和通知:

java

运行

import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; // 1. 标记为切面类 + Spring Bean @Aspect @Component public class LogAspect { // 2. 定义切点(复用性高,可被多个通知引用) // 切点表达式:匹配com.example.service包下所有类的所有方法 @Pointcut("execution(* com.example.service.*.*(..))") public void servicePointcut() {} // 3. 定义通知(增强逻辑) // 前置通知:目标方法执行前执行 @Before("servicePointcut()") public void beforeAdvice(JoinPoint joinPoint) { // JoinPoint可获取目标方法名、参数等信息 String methodName = joinPoint.getSignature().getName(); Object[] args = joinPoint.getArgs(); System.out.println("[前置通知] 方法:" + methodName + ",参数:" + java.util.Arrays.toString(args)); } // 后置返回通知:目标方法正常返回后执行 @AfterReturning(value = "servicePointcut()", returning = "result") public void afterReturningAdvice(JoinPoint joinPoint, Object result) { String methodName = joinPoint.getSignature().getName(); System.out.println("[返回通知] 方法:" + methodName + ",返回值:" + result); } // 异常通知:目标方法抛出异常后执行 @AfterThrowing(value = "servicePointcut()", throwing = "e") public void afterThrowingAdvice(JoinPoint joinPoint, Exception e) { String methodName = joinPoint.getSignature().getName(); System.out.println("[异常通知] 方法:" + methodName + ",异常:" + e.getMessage()); } // 环绕通知(最灵活,可控制目标方法执行) @Around("servicePointcut()") public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { String methodName = joinPoint.getSignature().getName(); System.out.println("[环绕前置] 开始执行方法:" + methodName); // 执行目标方法(必须调用,否则目标方法不会执行) Object result = joinPoint.proceed(); System.out.println("[环绕后置] 方法:" + methodName + "执行完成"); return result; // 可修改返回值 } }
步骤 5:测试 AOP 效果

编写测试类,启动 Spring 容器并调用目标方法:

java

运行

import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AopTest { public static void main(String[] args) { // 初始化Spring容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); // 获取目标Bean UserService userService = context.getBean(UserService.class); // 调用目标方法,触发AOP增强 userService.addUser("张三"); System.out.println("-----分割线-----"); userService.getUserById(1001); // 关闭容器 context.close(); } }
执行结果(正常情况):

plaintext

[环绕前置] 开始执行方法:addUser [前置通知] 方法:addUser,参数:[张三] 执行添加用户逻辑:张三 [环绕后置] 方法:addUser执行完成 -----分割线----- [环绕前置] 开始执行方法:getUserById [前置通知] 方法:getUserById,参数:[1001] 执行查询用户逻辑:id=1001 [返回通知] 方法:getUserById,返回值:用户-1001 [环绕后置] 方法:getUserById执行完成

三、关键知识点解析

  1. 切点表达式(execution 语法)上面用的execution(* com.example.service.*.*(..))是最常用的切点表达式,拆解如下:

    • *:返回值任意(第一个 *)
    • com.example.service.*:匹配 service 包下的所有类
    • .*:匹配类下的所有方法
    • (..):方法参数任意(数量、类型都不限)其他常用表达式:
    • 匹配指定方法:execution(public String com.example.service.UserService.getUserById(Integer))
    • 匹配注解:@annotation(org.springframework.transaction.annotation.Transactional)(匹配加了 @Transactional 的方法)
  2. 环绕通知的注意事项

    • ProceedingJoinPointJoinPoint的子类,只有环绕通知能使用。
    • 必须调用joinPoint.proceed()才能执行目标方法,否则目标方法不会运行。
    • 可通过proceed(args)修改目标方法的参数,也可修改返回值。
  3. AOP 的实现原理Spring AOP 基于动态代理实现:

    • 如果目标类实现了接口:使用 JDK 动态代理(生成接口的代理类)。
    • 如果目标类未实现接口:使用 CGLIB 动态代理(生成目标类的子类)。
    • @EnableAspectJAutoProxy(proxyTargetClass = true):强制使用 CGLIB 代理。

四、总结

  1. Spring AOP 实现的核心步骤:引入依赖 → 开启 AOP 注解 → 定义目标 Bean → 编写切面类(@Aspect + 切点 + 通知) → 测试。
  2. 注解式 AOP 是主流方式,核心注解包括@EnableAspectJAutoProxy(开启 AOP)、@Aspect(标记切面)、@Pointcut(定义切点)、各类通知注解(@Before/@Around 等)。
  3. 环绕通知(@Around)最灵活,但使用成本稍高;简单场景优先用 @Before/@AfterReturning 等简单通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

济南的户外广告投放公司哪家便宜? - 工业品牌热点

2026年户外广告行业持续向场景化、数字化、整合化升级,广告主对户外广告的需求已从单一曝光转向降本增效、数据增值、资源整合的综合解决方案。无论是城市核心商圈的大屏投放、跨区域地铁公交的全域覆盖,还是高铁高速…

【顶级EI复现】基于断线解环思想的配电网辐射状拓扑约束建模方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2026年评价高的胶粘剂,水性胶粘剂,注塑胶粘剂厂家选购参考指南 - 品牌鉴赏师

引言在 2026 年的工业制造与日常生活中,胶粘剂、水性胶粘剂以及注塑胶粘剂的应用愈发广泛,从厨具家电到汽车制造,从电子电气到建筑装饰,这些胶粘剂都发挥着至关重要的作用。然而,面对市场上众多的胶粘剂厂家,如何…

学霸同款8个AI论文写作软件,继续教育学生轻松搞定毕业论文!

学霸同款8个AI论文写作软件&#xff0c;继续教育学生轻松搞定毕业论文&#xff01; AI工具助力论文写作&#xff0c;轻松应对学术挑战 在当前的继续教育环境中&#xff0c;越来越多的学生面临着毕业论文的压力。无论是撰写初稿、修改内容&#xff0c;还是进行查重和降重&#x…

AI人工智能-强化学习-第十三周(小白)

一、强化学习(RL)和监督学习(SL)的核心区别 监督学习(比如分类, 回归):本质是“老师教学生”——给固定的“输入-输出答案”(比如图片->猫/狗标签、历史数据->股票价格),模型学“输入到答案的映射”,学会就只能做同类预测。 强化学习:是“学生自己摸爬滚打”…

【电压风险评估】基于720个样本与360个样本的Copula及蒙特卡罗推断结果比较研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

强烈安利8个AI论文软件,专科生搞定毕业论文必备!

强烈安利8个AI论文软件&#xff0c;专科生搞定毕业论文必备&#xff01; AI 工具助力论文写作&#xff0c;专科生也能轻松应对 对于许多专科生来说&#xff0c;毕业论文似乎是一个难以逾越的难关。从选题、查找资料到撰写初稿、反复修改&#xff0c;每一步都充满了挑战。而如今…

高价回收茅台五粮液 同城上门现金结算 京城亚南让老酒变现更安心 - 品牌排行榜单

家里藏着几瓶老茅台、陈年五粮液,想变现却总犯愁?怕遇到路边小商贩乱压价,担心上门鉴定被调包,又嫌自己搬运路途遥远风险高?这些困扰,京城亚南酒业全帮你解决!作为深耕老酒回收行业十年的正规企业,我们专注全国…

2026年石墨烯电锅炉厂家推荐榜:辽宁德威赫电热设备有限公司,储水式电锅炉/电锅炉/电热水锅炉/电采暖电锅炉/蓄热电锅炉/超导体电锅炉/电磁电锅炉/半导体电锅炉/全导体电锅炉厂家精选 - 品牌推荐官

在清洁能源与智能供暖需求持续增长的背景下,电锅炉凭借高效、环保、灵活等特性,成为工业与民用供暖领域的核心设备。据行业数据显示,2025年电锅炉市场规模达280亿元,同比增长15%,其中石墨烯电锅炉、电磁电锅炉等新…

2026年评价高的压敏胶,医用压敏胶,环保压敏胶厂家采购参考指南 - 品牌鉴赏师

引言在 2026 年,压敏胶市场持续蓬勃发展,医用压敏胶和环保压敏胶的需求更是与日俱增。为了给广大采购商提供一份客观、公正、实用的厂家采购参考指南,我们依据国内相关行业协会公开的数据以及权威白皮书内容,经过深…

【电动车】基于削峰填谷的电动汽车多目标优化调度策略研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&a…

2025年插补Y哪家强?最新口碑排名揭晓,46排刀机/刀塔车床/四轴机/动力刀塔/双主轴双排刀/插补Y/直Y/双主轴双刀塔插补Y品牌选哪家 - 品牌推荐师

在制造业迈向智能化、精密化的浪潮中,车铣复合机床已成为提升加工效率与精度的关键装备。其中,具备插补Y轴功能的机型,因其能够实现复杂轮廓的精密铣削、钻孔、攻牙等工序,在一次装夹中完成多面加工,显著减少工序…

2026 年高速/铁路/城市高架声屏障实力厂家推荐榜:河北上兴路桥工程有限公司,多场景降噪解决方案提供商 - 品牌推荐官

全国超60%的声屏障产能集聚于河北地区,一家企业在京津冀协同发展项目中,为单条铁路提供了长达18公里的声屏障,实测降噪效果达到28分贝。在交通噪声污染日益受到关注的今天,声屏障 已成为高速公路、铁路和城市高架不…

沃尔玛购物卡回收指南,正规平台让你放心变现 - 京回收小程序

沃尔玛购物卡回收指南,正规平台让你放心变现周末整理抽屉时翻出几张闲置的沃尔玛购物卡,面值加起来有2000多元。想起之前朋友因贪便宜找小作坊回收,结果卡密被盗刷损失惨重的经历,我立刻警觉起来——沃尔玛购物卡回…

详细介绍:nginx代理配置详解

详细介绍:nginx代理配置详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

边缘智能革命:让YOLO在FPGA上“飞”起来的软硬协同之道

当目标检测算法遇上边缘计算硬件,一场关于速度、精度与功耗的精妙平衡就此展开。你不是在压缩模型,而是在为算法设计专属的硅基座驾。 在一台无人机上进行实时目标检测,需要多少功耗?传统方案使用高性能GPU需要15-30瓦,而通过算法-硬件协同优化设计的FPGA加速系统,可以将…

1.17 模拟赛总结

\(t2\) 复杂度分析错误,后 \(1h\) 因做出两道题松懈。 如果感觉因理解题意超过 \(15min\) 应该最后处理这道题。 题目复杂度的分析不能想当然。 记数题多在纸上推式子。 如果做的特别顺,那别人做的也特别顺,切忌后场…

计及阶梯碳交易成本与多元储能的综合能源系统IES联合低碳优化调度——考虑热电联产机组、燃气机组...

计及阶梯碳交易成本多元储能&#xff08;电储能、氢储能、气储能、热储能&#xff09;综合能源系统IES联合低碳优化调度&#xff08;用MatlabYalmipCplex&#xff09; 考虑机组和设备&#xff1a;热电联产机组、燃气机组、甲烷反应生成设备 电解槽、氢燃料电池、计及新能源风电…

Oracle 19c入门学习教程,从入门到精通,SQL语言基础详解:语法、使用方法与综合案例(5)

SQL语言基础详解&#xff1a;语法、使用方法与综合案例 SQL&#xff08;Structured Query Language&#xff09;是用于管理关系型数据库的标准语言。本章系统讲解 SQL 语言的基础知识&#xff0c;包括其分类、编写规则、数据查询、函数使用、子查询、DML 操作等&#xff0c;并结…

可解释集成模型如何提升商品搜索效果

可解释集成模型改进商品检索 机器学习领域正飞速发展&#xff0c;新模型层出不穷&#xff0c;均承诺超越前代。然而&#xff0c;为特定用例评估新模型是一个耗时且消耗资源的过程。这对于像某中心的商店这样承诺为客户提供最先进技术、同时又全天候高负载运营的在线服务而言&am…