【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 生命周期…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...