Spring框架、02SpringAOP

news2024/9/20 18:49:16

SpringAOP

日志功能

基本方法

分析代码问题

  • 目前代码存在两个问题

    1. 代码耦合性高:业务代码和日志代码耦合在了一起

    2. 代码复用性低:日志代码在每个方法都要书写一遍

    b31e43aadec943448080c05dedd2b553.png
  • 问题解决方案

    1. 使用动态代理,将公共代码抽取出来

    630a1dfc7afe4e11abfd70e7007fd1ca.pnge69f0c222e314394b0f06d4bd032168d.png

JDK动态代理

使用JDK动态代理创建代理对象,完成日志的记录步骤分析

  1. 导入初始工程

  2. 确定目标类(被代理的类)

  3. 确定增强类(要给被代理类添加的功能)

  4. 使用JDK技术创建代理对象,然后调用其方法

    d51a4bd80d3c47a2a081349d60794212.png

动态代理: 目标对象(EmpServiceImpl) + 增强逻辑(Logger) = 代理对象

360b02a65930457d9c1a4e256606717e.png

基于JDK动态代理产生的代理对象与被代理对象是兄弟关系,二者实现同一个接口

CGLIB动态代理

动态代理: 目标对象(EmpServiceImpl) + 增强逻辑(Logger) = 代理对象

774dbf71caed43de8ac731464d96113c.png

基于Cglib动态代理产生的代理对象与被代理对象是父子关系,代理对象是被被代理对象的儿子

JDK和CGLIB

  • 首先明确在创建代理对象时,jdk的速度要高于cglib 所以选择的时候:

    1. 当被代理类有接口的时候,使用jdk动态代理

    2. 当被代理类没有接口的时候,使用cglib动态代理

AOP

AOP介绍

AOP介绍

  • AOP(Aspect Oriented Programming)面向切面编程

    1. 编码过程中将各个辅助功能分开编写, 运行时再将其织入到核心代码中

    2. 这种思想的实现技术是:动态代理(jdk、cglib)

    8a84f7b5959c46c1bb8c293318f687c3.png
  • SpringAOP就是为了简化动态切入这部分操作,开发者只需要通过少量的声明式配置,就可以实现AOP的编程 Spring会根据被代理的类是否有接口自动选择代理方式:

    1. 如果有接口,就采用jdk动态代理

    2. 如果没接口,就采用cglib的方式

    ececb4e52388460b8670974363ea2ac8.png

AOP术语

  1. 目标对象(Target) 被代理的对象

  2. 连接点(JoinPoint) 目标对象中得所有方法

  3. 切入点(PointCut) 目标对象中得要进行功能增强那部分方法

  4. 增强 (Advice 通知) 一个具体增强功能(增强对象 增强方法)

  5. 切面 (Aspect) 切面是一种描述,描述的是: 增强方法和切点方法的执行顺序(哪个增强方法在哪个切点的什么位置执行)

快速入门

使用SpringAop完成在业务层类中的方法上打印日志

基础步骤

  1. 创建模块,导入依赖

  2. 创建实体类

  3. 创建业务层接口和实现类

  4. 创建日志类

  5. 创建配置类

  6. 测试

动态代理步骤

  1. 在增强类中配置切点和切面

  2. 在配置类中激活切面代理

  3. 测试

在案例中体现的优势

  • 场景

    48c524fe9d394afe942ff47a73add471.png
  • 优势

    dd5d6464487641e18d12bca8a33efeec.png

通知类型

通知类型

  1. @Before:前置通知,此注解标注的通知方法在目标方法前被执行

  2. @AfterReturning: 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行

  3. @AfterThrowing: 异常后通知,此注解标注的通知方法发生异常后执行

  4. @After:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行

注意事项

  • @Around环绕通知需要自己调用 ProceedingJoinPoint.proceed() 来让原始方法执行,其他通知不需要考虑目标方法执行

  • @Around环绕通知方法的返回值,必须指定为Object,来接收原始方法的返回结果

通知顺序

  • 当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。

  • 执行顺序

    1. 不同切面类中,默认按照切面类的类名字母排序:

      • 目标方法前的通知方法:字母排名靠前的先执行

      • 目标方法后的通知方法:字母排名靠前的后执行

      b63140cc32d74de88ac90c73a4746409.png
    2. 用 @Order(数字) 加在切面类上来控制顺序

      • 目标方法前的通知方法:数字小的先执行

      • 目标方法后的通知方法:数字小的后执行

    c3b27e1e72ca46329be5f779584a4031.png

切点表达式

@PointCut

切点表达式

  • 切入点表达式:描述切入点方法的一种表达式

  • 作用:主要用来决定项目中的哪些方法需要加入通知

  • 常见形式:

    1. execution(……):根据方法的签名来匹配

    2. @annotation(……) :根据注解匹配

    c68e5a153d53460189410d80da7aedf6.png

切入点表达式-execution

e4a9435cc6ed4de7b5466eb8ebd424f2.png

execution 主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:

85533bf2dda94ab49dfa6c673fb1ec3c.png

  • 其中带 ? 的表示可以省略的部分

  • 表达式中支持使用一些特殊符号进行模糊匹配

    1. * 用于匹配1个位置

    2. .. 用于匹配0个或1个或多个位置,简单说就是任意位置

切入点表达式-@annotation

e31663e035cc49b19176cbe43014c8ca.png

@annotation 用于匹配标识有特定注解的方法

749da9de7aa54038910938021e655bcd.png

事务管理

事务回顾

事务回顾

  1. 概念

  • 事务 是一组操作的集合,它是一个不可分割的工作单元,这些操作 要么同时成功,要么同时失败。

  1. 操作

  • 开启事务(一组操作开始前,开启事务):start transaction / begin ;

  • 提交事务(这组操作全部成功后,提交事务):commit ;

  • 回滚事务(中间任何一个操作出现异常,回滚事务):rollback ;

事务管理

Spring事务管理

注解

  • 注解:@Transactional 位置:业务(service)层的方法上、类上、接口上

  • 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

c113696e61194ea8a2184aee25695176.png

事务属性

事务属性-回滚

rollbackFor

  • 默认情况下,只有出现 RuntimeException 才回滚异常,rollbackFor属性用于控制让非运行时异常也回滚。

7b1cca950fe5475b819fc6e0eddacd01.png

事务属性-传播行为

propagation

  • 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

1ac1862af4c8457f88ac706766a767b0.png

属性值含义
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须没事务,否则抛异常
 

场景

  • REQUIRED :大部分情况下都是用该传播行为即可。

  • REQUIRES_NEW :当我们不希望事务之间相互影响时,可以使用该传播行为。 比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功

 

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

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

相关文章

Ubuntu系统SSH免密连接Github配置方法

Ubuntu系统SSH免密连接Github配置方法 一、相关介绍1.1 Ubuntu简介1.2 Git简介1.3 Github简介 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、Git本地环境配置工作4.1 安装Git工具4.2 创建项目目录4.3 …

scp免密复制文件

实现在服务器A和服务器B之间使用scp命令免密互相传输文件 1. 在服务器A中免密复制到服务器B 1.1 生成服务器A的公钥私钥 #在服务器A中执行 ssh-keygen -t rsa -P ""命令执行完毕会在服务器A的 ~/.ssh 目录下生成两个文件:id_rsa 和 id_rsa.pub 1.2 拷…

网络爬虫入门(学习笔记)

爬取网页源代码 抓取百度首页的HTML源代码,并将其保存到一个名为baidu.html的文件中。打开这个文件,可以看到一个和百度首页一模一样的页面。 from urllib.request import urlopen# 发送请求并获取响应 response urlopen("http://www.baidu.com&q…

windows中使用Jenkins打包,部署vue项目完整操作流程

文章目录 1. 下载和安装2. 使用1. 准备一个 新创建 或者 已有的 Vue项目2. git仓库3. 添加Jenkinsfile文件4. 成功示例 1. 下载和安装 网上有许多安装教程,简单罗列几个 Windows系统下Jenkins安装、配置和使用windows安装jenkins 2. 使用 在Jenkins已经安装的基础上,可以开始下…

【游戏/社交】BFS算法评价用户核心程度or人群扩量(基于SparkGraphX)

【游戏/社交】BFS算法评价用户核心程度or人群扩量(基于SparkGraphX) 在游戏和社交网络领域,评估用户的核心程度或进行人群扩量是提升用户粘性和拓展社交圈的关键。广度优先搜索(BFS)算法以其在图结构中评估节点重要性…

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码,然后发送给B端,B端怎么解码? B端视频采用…

使用vscode搜索打开的文件夹下的文件

右键空白处打开命令面板 摁一次删除键,删除掉图中的大于号 这样就能够找到例化的模块,文件具体在哪个位置,然后打开了

pdf怎么压缩的小一点?PDF压缩变小的6种方法(2024全新)

pdf怎么压缩的小一点?首先,PDF文件可以进行压缩。职场文档传阅还是比较建议PDF压缩,PDF文件可以无障碍访问,保持原始文本、图像和表格,无需担心展示效果差异等等优势,成为我们日常工作中不可或缺的一部分。…

Grid Search:解锁模型优化新境界

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

8、添加第三方包

目录 1、安装Django Debug Toolbar Django的一个优势就是有丰富的第三方包生态系统。这些由社区开发的包,可以用来快速扩展应用程序的功能集 1、安装Django Debug Toolbar Django Debug Toolbar位于名列前三的第三方包之一 这是一个用于调试Debug Web应用程序的有…

win_vscode_wsl_ubuntu教程

文章目录 win_vscode_wsl_ubuntu教程 win_vscode_wsl_ubuntu教程 在启用或关闭Windows功能处开启适用于Linux的Windows子系统和虚拟机平台,可能会需要重启电脑 设置wsl # 将wsl2设置为默认版本 C:\Users\Administrator>wsl --set-default-version 2 有关与 WS…

PhantomJs将html生成img|pdf

PhantomJS PhantomJS是一个可编程的无头浏览器,‌它基于WebKit内核,‌通过JavaScript API进行脚本化操作,它对各种web标准有快速和原生化的支持,包括DOM处理、CSS选择器、JSON、Canvas和SVG。‌无头浏览器指的是一个完整的浏览器内…

QT反射内存读写操作

反射内存技术适用于通过以太网、光纤通道或其他串行网络连接计算机或可编程逻辑控制器的应用,尤其在实时交互和高通信要求的系统中表现突出。虽然价格较高,但其易用性和性能优势带来了显著回报。反射内存能够在微秒级内将计算机的内存副本分发到整个网络…

Element UI DatePicker选择日期范围区间默认显示前一个月和本月

要求&#xff1a;点击el-date-picker选择时间范围时&#xff0c;默认展开当月和上个月。 但是Element UI的组件默认展开的是本月和下一个月&#xff0c;如下图所示&#xff1a; 改为 <span click"changeInitCalendarRange"><el-date-picker v-model"r…

QT获取电脑网卡IP等信息

文章目录 一、背景信息二、代码实现 一、背景信息 电脑有一个或者多个网卡&#xff0c;如下图所示&#xff1a; 一个网卡又可以配有多个IP地址&#xff0c;包括 IPv4 和 IPv6 地址&#xff1a; 二、代码实现 以下代码实现了查找电脑所有网卡&#xff0c;并获取某个网卡的 IP …

苹果电脑crossover怎么下载 苹果电脑下载crossover对电脑有影响吗 MacBook下载crossover软件

CodeWeavers 发布了 CrossOver 24 版本更新&#xff0c;不仅兼容更多应用和游戏&#xff0c;得益于 Wine 9.0 带来的 7000 多项改进&#xff0c;CrossOver 还可以在 64 位系统上运行Windows应用的软件&#xff0c;使得用户可以在Mac系统中轻松安装使用仅支持Windows系统运营环境…

ubuntu源码安装Odoo

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo具有非常多的安装方式&#xff0c;除了我最爱用的 apt-get install&#xff0c;我们还可以使用git拉取Odoo源码进行安装。 本次示例于ubuntu20.04 Desktop上进行操作&#xff0c;理论上在ubuntu14.04之后都可以用此操作。 …

uniapp 小程序 嵌套 webview 返回需要点击两次

uniapp 小程序 嵌套 webview 返回需要点击两次 先 上图 小程序也监听不到 返回事件在网上找了一圈 都没有理想的答案&#xff0c;猜测 是因为嵌入的页面中有问题果然 小程序中嵌入的代码 <view><web-view :src"urlSrc" ></web-view></view>…

【思科】链路聚合实验配置和背景

【思科】链路聚合实验配置和背景 背景链路聚合基本概念链路聚合聚合接口 思科链路聚合协议01.PAgP协议02.LACP协议 思科链路聚合模式LACP协议模式PAgP协议模式ON模式 实验准备配置二层链路聚合LACP协议模式SW1SW2PC1PC2查看LACP聚合组建立情况查看LACP聚合端口情况查看逻辑聚合…

使用github actions构建多平台electron应用

1. 创建electron项目 使用pnpm创建项目 pnpm create quick-start/electron 2. 修改electron-builder.yml文件 修改mac的target mac:target:- target: dmgarch: universal 3. 添加workflow 创建 .github/workflows/main.yml 文件 name: Build/release Electron appon:work…