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.mzph.cn/pingmian/65579.shtml

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

相关文章

【算法】复杂性理论初步

六、算法复杂性初步 重要的复杂性类 P P P 的定义 多项式时间内可解的问题 若 L ∈ P L∈P L∈P&#xff0c;则存在确定性多项式时间的图灵机 M M M&#xff0c;使得 M ( x ) 1 ⟺ x ∈ L M(x)1⟺x∈L M(x)1⟺x∈L N P NP NP 的定义 多项式时间内可验证验证解的正确性 &…

python爬虫----爬取视频实战

python爬虫-爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要…

大数据面试笔试宝典之Flink面试

1.Flink 是如何支持批流一体的? F link 通过一个底层引擎同时支持流处理和批处理. 在流处理引擎之上,F link 有以下机制: 1)检查点机制和状态机制:用于实现容错、有状态的处理; 2)水印机制:用于实现事件时钟; 3)窗口和触发器:用于限制计算范围,并定义呈现结果的…

coturn docker 项目 搭建【一切正常】

业务需求&#xff1a;需要coturn这个服务 定制语音视频连线 请参考"小红的逃脱外星人追踪计划" coturn项目 本地测试连接服务 turnutils_stunclient -p 3478 127.0.0.1turnutils_stunclient -p 3478 -L 127.0.0.1 127.0.0.1telnet localhost 3478turnutils_uclient …

Linux 笔记 /etc 目录有什么用?

在 Linux 系统中&#xff0c;/etc 目录的全称是 "et cetera"&#xff0c;中文可以翻译为“其他”或“杂项”。这个目录用于存放系统的配置文件和一些启动脚本。名称来源于早期的 Unix 系统设计&#xff0c;当时它被用来存放那些不属于其他特定类别的系统文件。 随着…

Android 学习小记1

目录 先介绍一下Android Studio 看看常见的模板 1. No Activity 2. Empty Activity 3. Gemini API Starter 4. Basic View Activity 5. Bottom Navigation Activity 6. Empty Views Activity 7. Navigation Drawer Views Activity 8. Responsive Views Activity 9. G…

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ Keras 快速入门&#xff1a; 神经网络的基本数据结…

MySQL 数据库基础

目录 什么是数据库 数据库分类 关系型数据库 非关系型数据库 SQL子语言 MySQL MySQL 存储数据的组织方式 数据库操作 显示当前数据库 创建数据库 使用数据库 删除数据库 什么是数据库 数据库 是一个用于存储、管理和检索数据的系统&#xff0c;可以组织和保存大量…

《Vue3 二》Vue 的模板语法

在 React 中&#xff0c;想要编写 HTML&#xff0c;是使用 JSX&#xff0c;之后通过 Babel 将 JSX 编译成 React.createElement 函数调用&#xff1b;在 Vue 中&#xff0c;也支持 JSX 的开发模式&#xff0c;但大多数情况下都是使用基于 HTML 的模板语法&#xff0c;在模板中允…

高级技巧-使用Mysql 实现根据条件过滤整个分组数据

博客-mysql exists实现过滤所属条件对应分组的全部数据 在数据查询中&#xff0c;有时需要根据某一条件来过滤整个分组的数据&#xff0c;尤其是当某条记录满足特定条件时&#xff0c;需要将该组内的所有记录排除。本文将介绍如何使用 MySQL 的 EXISTS 关键字来实现这种分组过滤…

游戏引擎学习第67天

reviewing “apron”概念以更新区域 我们正在进行模拟区域的扩展工作&#xff0c;目标是通过增加一个更大的区域来支持更丰富的互动&#xff0c;尤其是那些可能超出摄像机视野的内容。现有的模拟区域包括摄像机能看到的区域和其周围的环境区域&#xff0c;但为了保证更高效的游…

计算机网络|数据流向剖析与分层模型详解

文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中&#xff0c;数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…

如何在 Spring Boot 微服务中设置和管理多个数据库

在现代微服务架构中&#xff0c;通常需要与多个数据库交互的服务。这可能是由于各种原因&#xff0c;例如遗留系统集成、不同类型的数据存储需求&#xff0c;或者仅仅是为了优化性能。Spring Boot 具有灵活的配置和强大的数据访问库&#xff0c;可以轻松配置多个数据库。在本综…

【Raven1靶场渗透】

文章目录 一、基础信息 二、信息收集 三、暴力破解 四、提权 一、基础信息 Kali IP &#xff1a;192.168.20.146 靶机IP &#xff1a;192.168.20.153 二、信息收集 nmap -sS -sV -p- -A 192.168.20.153 开放了22&#xff0c;80&#xff0c;111&#xff0c;58305端口 访…

视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案

Liveweb是一款功能强大、灵活部署的安防视频监控平台&#xff0c;支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统安防监控功能&#xff0c;还支持接入AI智能分析&#…

Pytorch | 利用SMI-FGRM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集SMI-FGRM介绍SMI-FGRM算法流程 SMI-FGRM代码实现SMI-FGRM算法实现攻击效果 代码汇总smifgrm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CI…

基于PREEvision的UML设计

众所周知&#xff0c;PREEvision是一款强大的电子电气架构协同开发及管理软件&#xff0c;可以很好地帮助架构工程师完成架构开发工作&#xff0c;其功能包括需求管理、定义功能逻辑、系统软件开发、网络设计、线束设计及整体工程的产品线管理和变形管理等。随着工程师们越来越…

闲谭Scala(2)--安装与环境配置

1. 概述 Java开发环境安装&#xff0c;需要两步&#xff0c;第一安装JDK&#xff0c;第二配置环境变量。 Scala的话&#xff0c;也是两步&#xff0c;第一安装Scale环境&#xff0c;第二配置环境变量。 需要注意的是&#xff0c;配置环境变量&#xff0c;主要是想让windows操…

智慧地下采矿:可视化引领未来矿业管理

图扑智慧地下采矿可视化平台通过整合多源数据&#xff0c;提供实时 3D 矿井地图及分析&#xff0c;提升了矿产开采的安全性与效率&#xff0c;为矿业管理提供数据驱动的智能决策支持&#xff0c;推动行业数字化转型。