【Spring篇】Spring的Aop详解

🧸安清h:个人主页
🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】
🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 
目录
🎯初始Sprig AOP及术语
🎯基于XML的AOP实现
🚦配置Spring AOP的XML元素
✨配置切面
✨配置切入点
🚦示例
✨创建UserDao类
✨创建UserDaoImpl类
✨创建XmlAdvice类
✨applicationContext-xml.xml文件
✨创建测试类
🎯基于注解的AOP实现
🚦Spring提供的注解
🚦代码示例
✨创建UserDao类
✨创建UserDaoImpl类
✨创建AnnoAdvice类
✨applicationConext.xml文件
✨创建测试类
🎯初始Sprig AOP及术语
Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个核心模块,它允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,以提高代码的模块化和可重用性。以下是一些Spring AOP中常用的术语,根据例子来展示其用法:

LogUtils中的printLog()方法用来输出日志
需求:针对UserService的save和delete方法做日志输出的增强
Join Point(连接点):能够被增强的叫做连接点。特指的是类中的方法,以上四个任何一个方法都可以被叫做连接点
Pointcut(切入点):将要被增强的方法。一个切入点一定是一个连接点,但是一个连接点并不一定是一个切入点。在例子中save()和delete()为切入点。
Advice(增强/通知):将要增强的功能所在的方法。例子中由于要对save和delete方法做日志的增强,所以printLog方法叫做增强advice。
Aspect(切面):用来配置切入点和增强关系的。
Target (目标对象):指的是将要被增强的方法所在的对象。例子中UserService对象就是Target对象。
Weaving(织入):将增强运用到切入点的过程叫做织入。
Proxy(代理):将增强运用到切入点之后形成的对象叫做代理对象。
🎯基于XML的AOP实现
Spring中AOP的代理对象是由IOC容器自动生成,所以开发者只需选择选择连接点,创建切面,定义切点并在XML中添加配置信息即可。Spring提供了一系列配置Spring AOP的XML元素。
AOP配置:在切面中配置切入点和增强的关系
🚦配置Spring AOP的XML元素
| 元素 | 描述 |
|---|---|
| <aop:config> | Spring AOP配置的根元素 |
| <aop:aspect> | 配置切面 |
| <aop:pointcut> | 配置切入点 |
| <aop:before> | 定义一个前置通知 |
| <aop:after> | 定义一个后置通知 |
| <aop:after-returning> | 定义一个返回后通知 |
| <aop:around> | 定义一个环绕通知 |
✨配置切面
在定义<aop:aspect>元素时,通常会指定id,ref这两个属性。
| 属性名称 | 描述 |
|---|---|
| id | 用于定义切面的唯一标识,切面起的名字(可以不设置) |
| ref | 用于引用普通的Spring Bean,引用的切面类对象bean的id值 |
✨配置切入点
在定义<aop:pointcut>元素时,通常会指定id,expression这两个属性。
| 属性名称 | 描述 |
|---|---|
| id | 用于指定切入点的唯一标识 |
| expression | 用于指定切入点关联的切入点的表达式 |
🚦示例
✨创建UserDao类
定义了用户数据操作的接口,包括增删改查四个方法。
public interface UserDao {public void insert();public void delete();public void update();public void select();
}
✨创建UserDaoImpl类
实现了UserDao接口,具体执行数据库操作的打印语句。
public class UserDaoImpl implements UserDao{@Overridepublic void insert() {System.out.println("添加用户信息");}@Overridepublic void delete() {System.out.println("删除用户信息");}@Overridepublic void update() {System.out.println("修改用户信息");}@Overridepublic void select() {System.out.println("查询用户信息");}
}
✨创建XmlAdvice类
定义了AOP切面,包含前置、后置、环绕、返回和异常通知方法。
public class XmlAdvice {// 前置通知public void before(JoinPoint joinPoint) {System.out.println("这是前置方法");System.out.println("目标类是:" + joinPoint.getTarget());System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());}// 返回通知public void afterReturning(JoinPoint joinPoint) {System.out.println("这是返回通知,方法不出现异常时调用");System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());}// 环绕通知public Object around(ProceedingJoinPoint point) throws Throwable {System.out.println("这是环绕之前的通知");Object object = point.proceed();System.out.println("这是环绕之后的通知");return object;}// 异常通知public void afterException() {System.out.println("异常通知!");}// 后置通知public void after() {System.out.println("这是后置通知!");}
}
✨applicationContext-xml.xml文件
Spring配置文件,配置了数据源、事务管理器、UserDaoImpl和XmlAdvice的Bean,并定义了AOP的切点和通知。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><aop:aspectj-autoproxy/><context:component-scan base-package="com.xml"/><bean id="userDao" class="com.xml.UserDaoImpl"/><bean id="xmlAdvice" class="com.xml.XmlAdvice"/><aop:config><aop:pointcut id="pointcut" expression="execution(* com.xml.UserDaoImpl.*(..))"/><aop:aspect ref="xmlAdvice"><aop:before method="before" pointcut-ref="pointcut"/><aop:after-returning method="afterReturning" pointcut-ref="pointcut"/><aop:around method="around" pointcut-ref="pointcut"/><aop:after-throwing method="afterException" pointcut-ref="pointcut"/><aop:after method="after" pointcut-ref="pointcut"/></aop:aspect></aop:config>
</beans>
✨创建测试类
测试类,通过Spring容器获取UserDao的Bean,并调用其方法来验证AOP功能是否正常工作。
public class TestXml {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-xml.xml");UserDao userDao = applicationContext.getBean("userDao", UserDao.class);userDao.delete();System.out.println();userDao.insert();System.out.println();userDao.select();System.out.println();userDao.update();}
}
这是部分运行出来的结果,由于过长,所以在这里只截取了delete部分的作为参考:

🎯基于注解的AOP实现
🚦Spring提供的注解
| 注解名称 | 描述 |
|---|---|
| @Aspect | 配置切面 |
| @Pointcut | 配置切入点 |
| @Before | 配置前置通知 |
| @After | 配置后置通知 |
| @Around | 配置环绕通知 |
| @AfterReturning | 配置返回通知 |
| @AfterThrowing | 配置异常通知 |
下面将通过一个示例来展现:
🚦代码示例
✨创建UserDao类
声明用户数据操作的接口
public interface UserDao {public void insert();public void delete();public void update();public void select();
}
✨创建UserDaoImpl类
实现UserDao接口,标注为Spring管理的Bean,并定义基本的数据库操作打印语句。
@Component("userDao")
public class UserDaoImpl implements UserDao{@Overridepublic void insert() {System.out.println("添加用户信息");}@Overridepublic void delete() {System.out.println("删除用户信息");}@Overridepublic void update() {System.out.println("修改用户信息");}@Overridepublic void select() {System.out.println("查询用户信息");}
}
✨创建AnnoAdvice类
定义切面,包括前置、后置、环绕、返回和异常通知,用于增强UserDaoImpl类的方法
@Aspect //告诉Spring,这个东西是用来做AOP的
public class AnnoAdvice {//切点@Pointcut("execution(* com.xml.UserDaoImpl.*(..))")public void pointcut(){}//前置通知@Before("pointcut()") //切入点和通知的绑定public void before(JoinPoint joinPoint){System.out.println("这是前置通知");System.out.println("目标类是:"+joinPoint.getTarget());System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());}//返回通知@AfterReturning("pointcut()")public void afterReturning(JoinPoint joinPoint){System.out.println("这是返回通知");System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());}//环绕通知@Around("pointcut()")public Object around(ProceedingJoinPoint point) throws Throwable {System.out.println("这是环绕通知之前的部分");Object object=point.proceed();System.out.println("这是环绕通知之后的部分");return object;}//异常通知@AfterThrowing("pointcut()")public void afterException(){System.out.println("这是异常通知");}//后置通知@After("pointcut()")public void after(){System.out.println("这是后置通知");}
}
✨applicationConext.xml文件
配置Spring的AOP命名空间、组件扫描和切面相关的Bean定义
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><aop:aspectj-autoproxy/><context:component-scan base-package="com.xml"/><bean id="annoAdvice" class="com.xml.AnnoAdvice"/>
</beans>
✨创建测试类
通过Spring容器获取UserDao的Bean,并调用其方法,预期将触发AnnoAdvice中定义的AOP通知
public class TestAnnotation {public static void main(String[]args){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao=applicationContext.getBean("userDao", UserDao.class);userDao.delete();System.out.println();userDao.insert();System.out.println();userDao.select();System.out.println();userDao.update();}
}
以上就是今天要讲的内容了,主要讲解了Spring AOP的术语及其两种实现方式等相关内容,如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!
相关文章:
【Spring篇】Spring的Aop详解
🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯初始Sprig AOP及…...
Spring与其他框架的比较
Spring 框架因其丰富的功能和灵活性,在 Java 领域内得到了广泛应用。然而,在不同的应用场景下,开发者可能会选择其他框架。下面将 Spring 框架与其他一些常见的 Java 框架进行比较,以便更好地理解它们各自的优缺点和适用场景。 1…...
论当前的云计算
随着技术的不断进步和数字化转型的加速,云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算,作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…...
Spring Boot 整合 RocketMQ 之消息消费手动提交 ACK 实战【案例分享】
前言: 上一篇我们分享了 RocketMQ 消息重试的一些基本原理,本篇我们基于 Spring Boot 整合 RocketMQ 来分享一下 RocketMQ 消息基于手动提交的案例,在分享手动进行消息 ACK 中也会分享消息重试的使用。 RocketMQ 系列文章传送门 RocketMQ …...
胃癌数据集(不定期更新)
恶性肿瘤其实就是癌症的一种,它是由一些不正常的细胞组成的,这些细胞会不停地生长和繁殖,而且它们还会侵犯周围的正常组织,甚至通过血液和淋巴系统跑到身体其他部位去。 恶性肿瘤有以下几个特点: 1、无限制生长&…...
zh/FAQ/CentOSStream-CentOS Stream 常见问题
CentOS Stream 是什么? CentOS Stream 是一个为开发者而设的发行版本,目的是要协助社群中的成员、Red Hat 伙伴及其它人在一个较稳定及可预测的 Linux 生态环境下充分利用创新的开源程序。 它的内容正是 Red Hat 有意收录于下个稳定版 RHEL 的软件。任何…...
多台西门子PLC与多台三菱PLC之间实时通讯的方案(PLC内不用编程)
PLC通讯智能网关IGT-DSER模块支持西门子、三菱、欧姆龙、罗克韦尔AB、GE等各种品牌的PLC之间通讯,同时也支持PLC与Modbus协议的变频器、智能仪表等设备通讯。网关有多个网口、串口,也可选择WIFI无线通讯。PLC内无需编程开发,在智能网关上配置…...
C++ [项目] 恶魔轮盘赌
现在才发现C游戏的支持率这么高,那就发几篇吧 零、前情提要 此篇是我与 同学的共创,他负责写人,我负责写机,简称人机, 不过有一点小插曲…… 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有…...
微信小程序版本更新管理——实现自动更新
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Python使用Selenium库实现CSDN自动化发帖
虽然CSDN上有很多优秀的作品,但也不乏很多很水的文章,我也不知道这种有什么意义。不过发这么水的文章多没意思,让浏览器自动化发帖就行了。以下程序能够实现CSDN自动化发帖,同时附自动给关注的人的文章点赞的程序。因为也有很多作…...
StringBulider和StringBuffer的底层源码剖析
要深入了解 StringBuffer 和 StringBuilder 的区别,从底层源码的角度来解析,包括它们的创建、扩容机制等,可以参考 JDK 1.8 的源码。 1. AbstractStringBuilder 类 StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder。…...
手机空号过滤接口-在线手机空号检测-手机空号过滤API
接口简介:在线检测手机号状态,与运营商平台联动大数据分析判断手机号状态。可划分出实号、空号、停机、流量卡、沉默号。 更新周期:两周 不支持号段:14、16、17、19号段 存在5%的误差,如需实时接口,可购买手…...
ubuntu 用ss-TPROXY实现透明代理,基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。
TPROXY 是一个 Linux 内核模块,在 Linux 2.6.28 后进入官方内核。 1 安装 tproxy 相关依赖 参考ss-tproxy 的安装依赖。 bash ss-tproxy 使用了 bash 的一些语法特性,比如 shell 数组,因此必须用 bash 解释器执行。大多数发行版已经自带了…...
报错解决:opene3d draw_geometries(): incompatible function arguments.
1. 报错信息 o3d.visualization.draw_geometries(target_pcd) TypeError: draw_geometries(): incompatible function arguments. The following argument types are supported:1. (geometry_list: List[open3d.cpu.pybind.geometry.Geometry], window_name: str Open3D, wid…...
Clickhouse笔记(二) 集群搭建
0.集群规划 操作系统使用ubuntu2204server,8C8G100G。 节点分片部署192.168.50.5分片1副本1clickhouse-server/clickhouse-client/keeper192.168.50.6分片1副本2clickhouse-server/clickhouse-client/keeper192.168.60.7分片2副本1clickhouse-server/clickhouse-c…...
华为云购买弹性云服务器(教程)
配置弹性云服务器 基础配置 实例 操作系统...
Python异常检测- 单类支持向量机(One-Class SVM)
系列文章目录 Python异常检测- Isolation Forest(孤立森林) python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子(LOF)算法 Python异常检测- DBSCAN 文章目录 系列文章目录前言一、On…...
基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...
NGAC访问控制系列三:低代码产品NGAC运用与算法运用
目录 一、基于NGAC的低代码模型权限管理方案 二、多策略访问控制系统限制内部访问的线性时间算法 1、概述 2、权限控制图遍历算法 一、基于NGAC的低代码模型权限管理方案 NGAC在低代码平台的权限决策模型:功能权限数据权限 案例:对于七巧低代码开发平台&…...
Unity3D 面试题收录
Unity3D 客户端面试题收录(持续更新~) 面试题收录 本文收录一些对于 Unity3D 客户端可能遇到的面试题(持续更新~),答案仅出于个人理解,如有偏差,希望指正。 Unity3D MonoBehaviour 生命周期…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...
