【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 生命周期…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
