Java-38 深入浅出 Spring - AOP切面增强 核心概念 相关术语 Proxy配置

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(已更完)
  • Spring(正在更新…)

在这里插入图片描述

章节内容

上节我们完成了:

  • 循环依赖 原型Bean
  • 原型作用域 Lazy
  • ObjectFactory

Spring AOP

AOP 的本质:在不改变原有逻辑的情况下,增强横切的逻辑,横切逻辑代码往往是权限校验代码、日志代码、事务控制代码、性能监控代码。

Spring AOP(面向切面编程,Aspect-Oriented Programming)是Spring框架的一部分,提供了基于代理的AOP功能。它允许你在不改变原有代码的情况下,向应用程序中添加额外的功能或行为。Spring AOP通过切面(Aspect)、连接点(Joinpoint)、通知(Advice)和切点(Pointcut)等概念提供了对程序流的控制,帮助实现横切关注点的模块化。横切关注点指的是跨越多个类或模块的功能,比如日志记录、事务管理、安全控制等。

核心概念

切面(Aspect)

切面是AOP的核心概念,表示横切关注点的模块化。切面是由切点和通知组成的,切面定义了哪些方法会应用额外的功能(通知)。

连接点(Joinpoint)

连接点表示程序执行中的一个点,比如方法调用、方法执行、构造函数调用等。Spring AOP中的连接点通常是方法执行的地方。

切点(Pointcut)

切点定义了哪些连接点是需要拦截的,它通常是基于方法签名进行筛选的。例如,选择某个包下所有的方法,或者某个类的方法。切点是一个表达式,表示何时需要执行通知。

通知(Advice)

通知定义了在连接点上执行的代码,通知决定了增强的具体行为。通知有不同的类型,分别是:

  • 前置通知(Before):方法执行前执行。
  • 后置通知(After):方法执行后执行,不论方法是否抛出异常。
  • 返回通知(AfterReturning):方法正常执行完后执行。
  • 异常通知(AfterThrowing):方法抛出异常时执行。
  • 环绕通知(Around):可以控制方法的执行,既可以选择执行方法,也可以选择不执行方法,或者修改方法的返回值。
  • 目标对象(Target Object):

目标对象是被AOP代理的对象,它是切面操作的实际对象。

Spring AOP的工作原理

Spring AOP基于代理模式来实现,它主要通过两种方式生成代理对象:

  • JDK动态代理:适用于目标对象实现了接口的情况。Spring会生成目标对象接口的代理类。
  • CGLIB代理:适用于目标对象没有实现接口的情况。Spring会通过CGLIB库生成目标对象的子类作为代理。

Spring AOP的优缺点

优点

  • 解耦:Spring AOP允许将横切关注点从核心业务逻辑中分离出来,增强了模块化。
  • 透明性:通过AOP,开发人员可以不改变原有代码,增加新的功能。
  • 灵活性:通过切面、通知、切点的灵活配置,可以精确控制横切功能的执行。

缺点

  • 性能开销:因为每个代理对象都会拦截方法调用,可能会对性能产生影响,特别是在复杂的应用中。
  • 复杂性:对于初学者来说,理解AOP的概念和Spring AOP的配置可能有一定的难度。

相关术语

业务主线

在讲解 AOP 术语之前,我们先来看一下这些图,它们的第三部分案例需求的扩展(针对这些扩展的需求,我们只进行分析,在这个基础上进一步去回顾 AOP)

在这里插入图片描述
上图描述的就是未采用的 AOP 思想的设计的程序,当我们红色框中圈定的方法时,会带来大量的重复劳动,程序中充斥着大量的重复代码,使我们程序的独立性很差,而下图中采用了 AOP 思想涉及的程序,它把红框部门的代码抽取出来的同时,运用动态代理技术,在运行期间对需要使用业务逻辑方法进行增强。

在这里插入图片描述

AOP术语

  • JoinPoint 连接点:它指的是那些可以用于增强代码加入到业务主线中的点,那么由上图中我们可以看出,这些点指的就是方法。在方法执行的前后通过动态代理的技术加入增强的代码。在 Spring 的框架 AOP思想的技术实现中,也只支持方法类型的连接点。
  • Pointcut 切点:它指的是已经增强的代码加入业务主线进行之后的连接点,由上图中,我们看出表现层 transfer 方法就只是连接点,因为判断访问权限的功能并没有对其进行增强。
  • Advice 通知增强:它指的是切面中用于提供增强功能的方法,并且不同方法增强的时机是不一样的。比如,开启事务肯定是在要在业务方法执行之前的,提交事务要肯定在业务方法执行之后的,而回滚的执行需要在业务方法出现错误的时候再执行。这些就是通知类型,目前的分类有:前置通知、后置通知、异常通知、最终通知、环绕通知。
  • Target 目标对象:它指的是代理的目标对象,即被代理对象
  • Proxy 代理对象:它指的是一个类被 AOP 织入增强后,产生的代理类,即代理对象。
  • Weaving 织入:它指的是增强应用到目标对象来创建新的代理的过程,Spring 采用动态代理织入,而 AspectJ 采用编译期间织入和类装载期间织入。
  • Aspect 切面:它指定是增强的代码所关注的方面,把这些相关的增强代码定义到一个类中,这个类就是切面,例如,事务切面,它里面定义的方法和事务相关的,像开启事务、提交事务、回滚事务等等,不会定义其他与事务无关的方法,之前提到的TransactionManager 就是一个切面。

这里还需要进行一定的解释:

  • 连接点:方法开始时、结束时、正常运行完毕的时候、方法异常的时候等等,这些特殊的时间点,我们称做连接点,项目中每个方法都有连接点,连接点是一种候选点。
  • 切入点:指定 AOP 思想要影响的具体的方法是哪些
  • Advice 增强,第一个层次:指的是横切逻辑
  • Adevice 增强,第二个层次:方位点(在某一些连接点上加入横切逻辑,那么这些连接点就叫做方位点,描述的是具体的特殊时机)
  • Aspect:切面概念是对上述概念的一个综合解释,切面=切入点+增强

AOP 代理选择

Spring 实现 AOP 思想使用的动态代理技术,默认情况下,Spring 会根据被代理对象是否实现接口来选择JDK 还是 CGLIB,当被代理对象实现了接口,Spring 会选择 JDK 官方的代理技术,不过我们可以通过配置的方式,让 Spring 强制使用 CGLIB 的方式。

AOP 配置方式

在 Spring 的 AOP 的配置中,和 IoC 配置一样,支持三类的配置方式:

  • 使用 XML 配置
  • 使用 XML + 注解的方式配置
  • 使用纯注解的方式配置

AOP 实现

需求描述

横切逻辑代码是打印日志,希望打印日志的逻辑织入到目标方法的特定位置

添加依赖

我们需要在 pom 中添加依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.12.RELEASE</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>

核心配置

我们在基于 XML 的配置步骤如下:

  • 把通知的 Bean 交给 Spring 管理
  • 使用 aop:config 开始 AOP 的配置
  • 使用 aop:aspect 配置切面
  • 使用对应的标签配置通知的类型,入门的案例采用前置通知,标签为 aop:before
<!-- 日志工具 交由给 Spring 进行管理 -->
<bean id="wzkLogUtils" class="wzk.utils.WzkLogUtils"></bean>
<!-- AOP 配置 -->
<aop:config><!-- 配置切面 --><aop:aspect id="wzkLogAdvice" ref="wzkLogUtils"><aop:before method="printLog" pointcut="execution(public * wzk.service.impl.WzkTransferServiceImpl.update(wzk.model.WzkAccount))"></aop:before></aop:aspect>
</aop:config>

对应的代码如下所示:
在这里插入图片描述
上述的配置实现了 WzkTransferServiceImpl.update 方法进行了增强,在其执行之前,输出了记录日志的语句,这里有一个新的概念:【切入点表达式】

切入点表达式

切入点表达式也叫做 AspectJ 切入点表达式,指的是遵循特定的语法结构的字符串,其作用的是用于对符合的语法格式的连接点进行增强,它是 AspectJ 的一部分。
AspectJ 是一个基于 Java 的 AOP 框架,Spring 框架从 2.0 版本之后集成了 AspectJ 框架中切入点表达式部分,开始支持 AspectJ 切入点表达式。

改变代理的配置

改变代理的配置,Spring 在选择创建代理的时候,会根据被代理对象实际情况来选择的,被代理对象实现了接口,则采用基于接口的动态代理,当被代理对象没有实现任何接口的时候,Spring 会自动切换到基于子类的动态代理方式。
但是我们都知道,无论被代理对象是否实现接口,只要不是 final 修饰的类都可以采用 CGLIB 提供的方式创建代理对象,所以 Spring 也考虑到了这个情况,提供了配置方式实现强制使用基于子类的动态代理(即 CGLIB 的方式),配置的方式有两种:

  • aop:config 标签来配置 proxy-target-class=“true”
  • aop:aspectj-autoproxy 标签来配置 proxy-target-class=“true”

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

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

相关文章

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量

参考链接&#xff1a;苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里&#xff1a; 1.登录开发者中心 Sign In - Apple 2.找到证书设置&#xff1a; Certificate&#xff0c;Identifiers&Profiles > Profiles > 选择对应证书 edit &g…

【HENU】河南大学计院2024 计算机网络 期末复习知识点

和光同尘_我的个人主页 一直游到海水变蓝。 计网复习 第一章互联网组成类别交换方式分组交换的要点&#xff1a;分组交换的优点&#xff1a; 网络性能指标体系结构网络协议五层协议 第二章&#xff1a;物理层物理层的主要任务&#xff08;四大特性&#xff09;通信的三种方式…

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

一文读懂变分自编码(VAE)

一文读懂变分自编码(VAE) 概述 变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09;是一种生成模型&#xff0c;用于学习数据的潜在表示并生成与原始数据分布相似的新数据。它是一种概率模型&#xff0c;通过结合深度学习和变分推断的思想&#xff0c;解决了传…

第十七周:Fast R-CNN论文阅读

Fast R-CNN论文阅读 摘要Abstract文章简介1. 引言2. Fast R-CNN框架2.1 RoI位置信息映射2.2 RoI pooling2.3 分类器与边界框回归器2.4 以VGG16为backbone的Fast RCNN的网络结构 3. 训练细节3.1 采样3.2 多任务损失 4. 优缺点分析总结 摘要 这篇博客介绍了Fast R-CNN&#xff0…

ThinkPHP 8开发环境安装

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 1. 安装PHP8 Windows系统用户可以前往https://windows.php.net/downloads/releases/archives/下载PHP 8.0版本&am…

VM虚拟机配置ubuntu网络

目录 桥接模式 NAT模式 桥接模式 特点&#xff1a;ubuntu的IP地址与主机IP的ip地址不同 第一部分&#xff1a;VM虚拟机给ubuntu的网络适配器&#xff0c;调为桥接模式 第二部分&#xff1a;保证所桥接的网络可以上网 第三部分&#xff1a;ubuntu使用DHCP&#xff08;默认&…

日本IT行业|分享实用的开发语言及框架

在日本IT行业中&#xff0c;开发语言与框架的选择非常多样化&#xff0c;但也有一些特定的技术和框架更为流行。以下是对日本IT行业在用的开发语言与框架的详细分享&#xff1a; 开发语言 Java&#xff1a;Java在日本是一门非常稳定且受欢迎的编程语言&#xff0c;很多日本公…

【畅购商城】校验用户名、手机号以及前置技术Redis和阿里大鱼短信验证码

搭建环境 后端web服务&#xff1a;changgou4-service-web修改pom.xml文档 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

[创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较

目录 一、波士顿矩阵 1、基本原理 2、各象限产品的定义及战略对策 3、应用 4、优点与局限性 二、技术成熟度模型与产品生命周期模型的配对 1、技术成熟度模型 2、产品生命周期模型 3、技术成熟度模型与产品生命周期模型的配对 三、产品生命周期与产品类型的对应关系 …

第三方接口设计注意要点

实际工作中&#xff0c;我们会遇到与三方系统对接的情形&#xff0c;比如对接短信服务、支付服务、地图服务、以及一些外部业务系统的调用和回调等等&#xff0c;不论是我们调用第三方接口还是我们为其他系统提供接口服务&#xff0c;调用过程中会遇到一些大大小小的问题和吐槽…

折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务

背景 之前写过&#xff0c;我在家里用了一台旧的工作站笔记本做了服务器&#xff0c;连上一个绿联的5位硬盘盒实现简单的网盘功能&#xff0c;然而&#xff0c;还是觉的不太理想&#xff0c;比如使用filebrowser虽然可以备份文件和图片&#xff0c;当使用手机使用网页&#xf…

【设计与实现】基于Bootstrap的地方旅游管理系统的设计与实现

目录 第一章 绪论 1.1 研究现状 1.2 设计原则 1.3 研究内容 第四章 系统设计 4.1系统结构设计 4.2系统顺序图设计 4.3数据库设计 第五章 系统实现 5.1登录模块的实现 第一章 绪论 1.1 研究现状 时代的发展&#xff0c;我们迎来了数字化信息时代&#xff0c;它正在渐…

人工智能与区块链的碰撞:双剑合璧的创新前景

引言 人工智能&#xff08;AI&#xff09;与区块链技术&#xff0c;这两项曾经各自独立发展的前沿科技&#xff0c;如今正逐步走向融合。人工智能通过强大的数据处理能力和智能决策能力&#xff0c;在各个领域掀起了革命性的变革&#xff1b;而区块链凭借其去中心化、不可篡改的…

HarmonyOS NEXT 实战之元服务:静态案例效果---我的热门应用服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index import { authentica…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图&#xff0c;如下&#xff1a; 图片可点击放大 接下来我们来介绍一下 推荐学习&#xff1a;GIS入门模型构建器Arcpy批量…

数字图像处理

一 形态学处理 ①二值图像 PS&#xff1a;1&#xff08;255&#xff09;代表的是白 0代表的是黑&#xff08;0就是什么都看不见&#xff0c;就是黑&#xff09; ②灰度图像 ③彩色图像 ④数学形态学基础&#xff1a;是分析几何形状和结构的数学方法&#xff0c;它建立在…

linux-软硬链接

我们今天再来聊一下这个"软硬链接"的问题. 目录 1. 软硬链接长什么样?2. 软连接和硬链接的特征 和 应用2.1 软连接特征 及其 应用?①软连接是什么?②软连接的应用1: 快捷方式③软连接的应用2: 方便维护库文件 2.2 硬连接特征 及其 应用?①硬链接是什么?②引用计…

SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现

本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作&#xff0c;帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询&#xff0c;还是复杂的多表联动&#xff0c;甚至是大数据量的批量操作…