当前位置: 首页 > news >正文

【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方法做日志输出的增强

  1. Join Point(连接点):能够被增强的叫做连接点。特指的是类中的方法,以上四个任何一个方法都可以被叫做连接点

  2. Pointcut(切入点):将要被增强的方法。一个切入点一定是一个连接点,但是一个连接点并不一定是一个切入点。在例子中save()和delete()为切入点。

  3. Advice(增强/通知):将要增强的功能所在的方法。例子中由于要对save和delete方法做日志的增强,所以printLog方法叫做增强advice。

  4. Aspect(切面):用来配置切入点和增强关系的。

  5. Target (目标对象):指的是将要被增强的方法所在的对象。例子中UserService对象就是Target对象。

  6. Weaving(织入):将增强运用到切入点的过程叫做织入。

  7. 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详解

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】【Spring篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;初始Sprig AOP及…...

Spring与其他框架的比较

Spring 框架因其丰富的功能和灵活性&#xff0c;在 Java 领域内得到了广泛应用。然而&#xff0c;在不同的应用场景下&#xff0c;开发者可能会选择其他框架。下面将 Spring 框架与其他一些常见的 Java 框架进行比较&#xff0c;以便更好地理解它们各自的优缺点和适用场景。 1…...

论当前的云计算

随着技术的不断进步和数字化转型的加速&#xff0c;云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算&#xff0c;作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…...

Spring Boot 整合 RocketMQ 之消息消费手动提交 ACK 实战【案例分享】

前言&#xff1a; 上一篇我们分享了 RocketMQ 消息重试的一些基本原理&#xff0c;本篇我们基于 Spring Boot 整合 RocketMQ 来分享一下 RocketMQ 消息基于手动提交的案例&#xff0c;在分享手动进行消息 ACK 中也会分享消息重试的使用。 RocketMQ 系列文章传送门 RocketMQ …...

胃癌数据集(不定期更新)

恶性肿瘤其实就是癌症的一种&#xff0c;它是由一些不正常的细胞组成的&#xff0c;这些细胞会不停地生长和繁殖&#xff0c;而且它们还会侵犯周围的正常组织&#xff0c;甚至通过血液和淋巴系统跑到身体其他部位去。 恶性肿瘤有以下几个特点&#xff1a; 1、无限制生长&…...

zh/FAQ/CentOSStream-CentOS Stream 常见问题

CentOS Stream 是什么&#xff1f; CentOS Stream 是一个为开发者而设的发行版本&#xff0c;目的是要协助社群中的成员、Red Hat 伙伴及其它人在一个较稳定及可预测的 Linux 生态环境下充分利用创新的开源程序。 它的内容正是 Red Hat 有意收录于下个稳定版 RHEL 的软件。任何…...

多台西门子PLC与多台三菱PLC之间实时通讯的方案(PLC内不用编程)

PLC通讯智能网关IGT-DSER模块支持西门子、三菱、欧姆龙、罗克韦尔AB、GE等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的变频器、智能仪表等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。PLC内无需编程开发&#xff0c;在智能网关上配置…...

C++ [项目] 恶魔轮盘赌

现在才发现C游戏的支持率这么高&#xff0c;那就发几篇吧 零、前情提要 此篇是我与 同学的共创,他负责写人,我负责写机,简称人机, 不过有一点小插曲…… 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有…...

微信小程序版本更新管理——实现自动更新

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Python使用Selenium库实现CSDN自动化发帖

虽然CSDN上有很多优秀的作品&#xff0c;但也不乏很多很水的文章&#xff0c;我也不知道这种有什么意义。不过发这么水的文章多没意思&#xff0c;让浏览器自动化发帖就行了。以下程序能够实现CSDN自动化发帖&#xff0c;同时附自动给关注的人的文章点赞的程序。因为也有很多作…...

StringBulider和StringBuffer的底层源码剖析

要深入了解 StringBuffer 和 StringBuilder 的区别&#xff0c;从底层源码的角度来解析&#xff0c;包括它们的创建、扩容机制等&#xff0c;可以参考 JDK 1.8 的源码。 1. AbstractStringBuilder 类 StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder。…...

手机空号过滤接口-在线手机空号检测-手机空号过滤API

接口简介&#xff1a;在线检测手机号状态&#xff0c;与运营商平台联动大数据分析判断手机号状态。可划分出实号、空号、停机、流量卡、沉默号。 更新周期&#xff1a;两周 不支持号段&#xff1a;14、16、17、19号段 存在5%的误差&#xff0c;如需实时接口&#xff0c;可购买手…...

ubuntu 用ss-TPROXY实现透明代理,基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。

TPROXY 是一个 Linux 内核模块&#xff0c;在 Linux 2.6.28 后进入官方内核。 1 安装 tproxy 相关依赖 参考ss-tproxy 的安装依赖。 bash ss-tproxy 使用了 bash 的一些语法特性&#xff0c;比如 shell 数组&#xff0c;因此必须用 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&#xff0c;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&#xff08;孤立森林&#xff09; python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子&#xff08;LOF&#xff09;算法 Python异常检测- DBSCAN 文章目录 系列文章目录前言一、On…...

基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...

NGAC访问控制系列三:低代码产品NGAC运用与算法运用

目录 一、基于NGAC的低代码模型权限管理方案 二、多策略访问控制系统限制内部访问的线性时间算法 1、概述 2、权限控制图遍历算法 一、基于NGAC的低代码模型权限管理方案 NGAC在低代码平台的权限决策模型&#xff1a;功能权限数据权限 案例&#xff1a;对于七巧低代码开发平台&…...

Unity3D 面试题收录

Unity3D 客户端面试题收录&#xff08;持续更新~&#xff09; 面试题收录 本文收录一些对于 Unity3D 客户端可能遇到的面试题&#xff08;持续更新~&#xff09;&#xff0c;答案仅出于个人理解&#xff0c;如有偏差&#xff0c;希望指正。 Unity3D MonoBehaviour 生命周期…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...