Spring AOP 核心概念与实践指南

第一章:AOP 核心概念与基础应用

1.1 AOP 核心思想

  • 面向切面编程:通过横向抽取机制解决代码重复问题(如日志、事务、安全等)
  • 核心优势:不修改源代码增强功能,提高代码复用性和可维护性

1.2 基础环境搭建(Maven 依赖)

<dependencies><!-- Spring Core --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!-- AOP 支持 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency><!-- 其他必要依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

1.3 事务管理案例实践

AccountServiceImpl 核心方法

public void saveAll(Account acc1, Account acc2) {// 原始业务逻辑accountDao.save(acc1);accountDao.save(acc2);
}

动态代理实现事务增强

public class JdkProxy {public static Object getProxy(AccountService target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),(proxy, method, args) -> {try {TxUtils.startTransaction();Object result = method.invoke(target, args);TxUtils.commit();return result;} catch (Exception e) {TxUtils.rollback();throw e;} finally {TxUtils.close();}});}
}

第二章:AOP 核心术语与 XML 配置

2.1 七大核心概念

  1. Joinpoint(连接点)​:可被拦截的方法(Spring 仅支持方法级别)
  2. Pointcut(切入点)​:实际被增强的方法集合
  3. Advice(通知)​:增强逻辑的具体实现
  4. Target(目标对象)​:被代理的原始对象
  5. Weaving(织入)​:将增强应用到目标对象的过程
  6. Proxy(代理)​:增强后生成的新对象
  7. Aspect(切面)​:切入点 + 通知的组合体

2.2 XML 配置实战

Spring 配置模板

<aop:config><aop:aspect ref="txAspect"><aop:before method="beginTransaction"pointcut="execution(* com.example.service.*.*(..))"/></aop:aspect>
</aop:config>

切入点表达式详解

  • execution([修饰符] 返回类型 包名.类名.方法名(参数))
  • 常用通配符:
    • * 匹配任意内容
    • .. 匹配任意包路径或参数列表
    • 示例:execution(* com.example..*Service.*(..))

2.3 五种通知类型

通知类型XML 标签执行时机
前置通知<aop:before>方法执行前
后置通知<aop:after-returning>方法正常返回后
异常通知<aop:after-throwing>方法抛出异常时
最终通知<aop:after>方法最终结束
环绕通知<aop:around>方法执行前后均可控制

环绕通知示例

public Object around(ProceedingJoinPoint pjp) throws Throwable {try {System.out.println("前置增强");Object result = pjp.proceed();System.out.println("后置增强");return result;} catch (Exception e) {System.out.println("异常处理");throw e;}
}

第三章:注解驱动 AOP 开发

3.1 快速入门

切面类配置

@Aspect
@Component
public class LogAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint jp) {System.out.println("方法执行前: " + jp.getSignature());}
}

启用 AOP 注解支持

<!-- XML 方式 -->
<aop:aspectj-autoproxy/><!-- 纯注解方式 -->
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example")
public class AppConfig {}

3.2 注解通知类型

注解等效 XML说明
@Before方法执行前
@AfterReturning方法正常返回后
@AfterThrowing方法抛出异常时
@After方法最终结束
@Around环绕通知

3.3 最佳实践建议

  1. 切面组织原则

    • 按功能模块划分切面(如日志切面、事务切面)
    • 使用@Pointcut统一管理切入点
    @Aspect
    public class SystemArchitecture {@Pointcut("within(com.example.web..*)")public void inWebLayer() {}
    }
  2. 性能优化技巧

    • 避免在切面中执行耗时操作
    • 使用条件表达式减少不必要的增强
  3. 常见问题排查

    • 确保 Aspect 类被 Spring 管理(添加@Component)
    • 检查切入点表达式是否匹配目标方法
    • 确认是否启用自动代理(@EnableAspectJAutoProxy)

第四章:AOP 应用场景与进阶

4.1 典型应用场景

  1. 声明式事务管理
  2. 统一日志记录
  3. 权限控制与安全检查
  4. 性能监控与统计
  5. 异常统一处理

4.2 高级特性

组合切入点表达式

@Pointcut("execution(* com.example.dao.*.*(..))")
public void dataAccessOperation() {}@Pointcut("execution(* com.example.service.*.*(..))")
public void businessService() {}@Before("dataAccessOperation() || businessService()")
public void combinedPointcut() {// 组合逻辑
}

自定义注解实现 AOP

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditLog {}@Aspect
@Component
public class AuditAspect {@Around("@annotation(AuditLog)")public Object audit(ProceedingJoinPoint pjp) throws Throwable {// 审计逻辑实现}
}

通过系统学习 Spring AOP 的核心概念、配置方式和实践技巧,开发者可以更高效地实现业务逻辑与非功能性需求的解耦,构建更健壮、可维护的企业级应用。

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

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

相关文章

Flutter使用自签证书打包ipa

在 Flutter 中使用自签证书打包 IPA 文件&#xff0c;可以通过以下步骤完成&#xff1a; 1. 准备自签证书 方式一 生成自签证书&#xff1a; 打开 钥匙串访问 应用。选择 证书助理 > 创建证书。按照提示填写证书信息&#xff0c;选择证书类型为 代码签名&#xff0c;并保存…

基于STM32的机器人控制系统设计方案

一、系统概述 该机器人控制系统以STM32微控制器为核心,旨在实现对机器人的运动控制、传感器数据采集与处理、任务调度以及人机交互等功能。适用于多种类型的移动机器人,如轮式机器人、履带式机器人等,可应用于室内导航、环境监测、物流搬运等场景。 二、硬件设计 STM32微控…

【leetcode hot 100 51】N皇后

解法一&#xff1a;&#xff08;基于集合的回溯&#xff09;我们从第一行开始寻找&#xff0c;找每一行皇后应该放在第几列。每次找到都用Set记录已经用过的列和对角&#xff0c;其中从左到右向下的对角&#xff08;行-列相同&#xff09;&#xff0c;右到左向下的对角&#xf…

蓝桥刷题note9(分发饼干,最长回文子串)

1.分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有…

面试常问系列(一)-神经网络参数初始化

一、背景 说到参数初始化&#xff0c;先提一下大家常见的两个概念梯度消失和梯度爆炸。 &#xff08;一&#xff09;、梯度消失&#xff1a;深层网络的“静默杀手” 定义&#xff1a; 在反向传播过程中&#xff0c;梯度值随着网络层数增加呈指数级衰减&#xff0c;最终趋近…

Manacher 马拉车算法

Manacher 马拉车算法 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 马拉车算法是目前解决寻找字符串中最长的回文子串时间复杂度最低的算法&#xff08;线性O(n)&#xff09;. 中心扩散法 初始化一个长度与字符串 s 相等的 臂长数组 arr 和 最长臂长 max 与 最…

(学习总结29)Linux 进程概念和进程状态

Linux 进程概念 冯诺依曼体系结构软件运行与存储分级数据流动的理论过程 操作系统操作系统(Operator System) 概念操作系统的功能与作用系统调用和库函数概念 进程概念描述进程 - PCBtask_struct查看进程通过系统调用获取进程标示符 PID通过系统调用 fork 函数创建进程简单使用…

MySQL密码修改的全部方式一篇详解

本文将详细介绍多种修改MySQL密码的方式。 本文目录 一、alter user 语句操作步骤 二、set password操作步骤 三、直接修改 mysql.user表操作步骤 一、alter user 语句 当你以 root 用户或者拥有足够权限的用户登录 MySQL 时&#xff0c;可以使用 ALTER USER 语句来修改密码。…

Wi-Fi NAN 架构(Wi-Fi Aware Specification v4.0,第2章:2.3~2.6)

1. NAN 数据通信架构 1.1 单播支持 要在两个NAN设备之间启动单播数据通信&#xff0c;服务需发起一个NAN数据路径&#xff08;NDP&#xff0c;NAN Data Path&#xff09;请求。这对NAN设备之间会建立一个NAN设备链路&#xff08;NDL&#xff0c;NAN Device Link&#xff09;&…

Lineageos 22.1(Android 15)实现负一屏

一、前言 方案是参考的这位大佬的&#xff0c;大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整&#xff0c;加入aidl引入&#xff0c;这样make之后就可以索引代码了 filegroup {name: "launcher-src"…

Java 大视界 -- Java 大数据在智能医疗远程会诊与专家协作中的技术支持(146)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Sqlite3数据库

工具库的使用&#xff1a;程序编写时#include <库名.h>即可调用库中的函数 编译时链接工具库&#xff1b; 注意&#xff1a;数据库中不区分字母大小写&#xff1b; SQLite 中的事务是数据库操作中非常重要的一个概念&#xff0c;它用于确保数据库操作的完整性和一致性。…

虚拟路由与单页应用(SPA):详解

在单页应用&#xff08;SPA&#xff0c;Single Page Application&#xff09;中&#xff0c;虚拟路由&#xff08;也称为前端路由&#xff09;是一种关键的技术&#xff0c;用于管理页面导航和状态变化&#xff0c;而无需重新加载整个页面。为了帮助你更好地理解这一概念&#…

练习:运动计划

需求&#xff1a;键盘录入星期数&#xff0c;显示今天的减肥活动。 周一&#xff1a;跑步&#xff1b; 周二&#xff1a;游泳&#xff1b; 周三&#xff1a;慢走&#xff1b; 周四&#xff1a;骑动感单车&#xff1b; 周五&#xff1a;拳击&#xff1b; 周六&#xff1a;…

通过webrtc+canvas+css实现简单的电脑滤镜拍照效果

这里我们用的是webrtc中的MediaDevices.getUserMedia()的浏览器api进行的效果实现&#xff0c;MediaDevices.getUserMedia() 会提示用户给予使用媒体输入的许可&#xff0c;媒体输入会产生一个MediaStream&#xff0c;里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道…

《TCP/IP网络编程》学习笔记 | Chapter 20:Windows 中的线程同步

《TCP/IP网络编程》学习笔记 | Chapter 20&#xff1a;Windows 中的线程同步 《TCP/IP网络编程》学习笔记 | Chapter 20&#xff1a;Windows 中的线程同步用户模式和内核模式用户模式同步内核模式同步 基于 CRITICAL_SECTION 的同步内核模式的同步方法基于互斥量对象的同步基于…

VBA-Excel

VBA 一、数据类型与变量 常用数据类型&#xff1a; Byte&#xff1a;字节型&#xff0c;0~255。Integer&#xff1a;整数型&#xff0c;用于存储整数值&#xff0c;范围 -32768 到 32767。Long&#xff1a;长整型&#xff0c;可存储更大范围的整数&#xff0c;范围 -214748364…

kotlin 内联函数 inline

高阶函数实现的原理&#xff1a;函数类型其实是生成了一个对象 。 inline翻译成中文的意思就是内联&#xff0c;在kotlin里面inline被用来修饰函数&#xff0c;表明当前函数在编译时是以内嵌的形式进行编译的&#xff0c;从而减少了一层函数调用栈&#xff1a; inline fun fun…

PairRE: Knowledge Graph Embeddings via Paired Relation Vectors(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2020年11月 25年3月24日交 目录 一、简介 二、原理 1.整体 2.关系模式 3.优化模型 三、实验性能 四、结论和未来工作 一、简介 将RotatE进行生级&#xff0c;RotatE只对头实体h进行计算&#xff0c;PairRE对头尾实体都进行…

从报错到成功:Mermaid 流程图语法避坑指南✨

&#x1f680; 从报错到成功&#xff1a;Mermaid 流程图语法避坑指南 &#x1f680; &#x1f6a8; 问题背景 在开发文档或技术博客中&#xff0c;我们经常使用 Mermaid 流程图 来可视化代码逻辑。但最近我在尝试绘制一个 Java Stream 转换流程图时&#xff0c;遭遇了以下报错…