Spring框架、02SpringAOP

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.rhkb.cn/news/382568.html

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

相关文章

英迈中国与 Splashtop 正式达成战略合作协议

2024年7月23日,英迈中国与 Splashtop 正式达成战略合作协议,英迈中国正式成为其在中国区的战略合作伙伴。此次合作将结合 Splashtop 先进的远程桌面控制技术和英迈在技术服务与供应链管理领域的专业优势,为中国地区的用户带来更加安全的远程访…

IEDA怎么把springboot项目 启动多个

利用Idea提供的Edit Configurations配置应用参数。 点击Modify Options进行添加应用参数: 确保这里勾选

centos系统mysql主从复制(一主一从)

文章目录 mysql80主从复制(一主一从)一、环境二、服务器master1操作1.开启二进制日志2. 创建复制用户3. 服务器 slave1操作4. 在主数据库中添加数据 mysql80主从复制(一主一从) 一、环境 准备两台服务器,都进行以下操…

前端在浏览器总报错,且获取请求头中token的值为null

前端请求总是失败说受跨域请求影响,但前后端配置已经没有问题了,如下: package com.example.shop_manage_sys.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Conf…

Java使用AsposePDF和AsposeWords进行表单填充

声明:本文为作者Huathy原创文章,禁止转载、爬取!否则,本人将保留追究法律责任的权力! 文章目录 AsposePDF填充表单adobe pdf表单准备引入依赖编写测试类 AsposeWord表单填充表单模板准备与生成效果引入依赖编码 参考文…

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术,可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用,只负责数据的路…

高效部署Modbus转MQTT网关:Modbus RTU、Modbus TCP转MQTT

钡铼Modbus转MQTT网关,简而言之,就是通过将Modbus协议(包括Modbus RTU和Modbus TCP)的数据转换为MQTT协议的数据格式,从而实现设备数据的上传和云端控制指令的下发。这一转换过程使得设备能够与基于MQTT协议的云平台进…

修改 Tomcat 默认端口号最简单的方法

前言 每次在创建一个新的Maven项目之后,启动项目总会报8080端口号被占用的问题,既然每次都有这样的困扰,那不如一了百了,直接修改默认的8080端口号。 (如果还是想要默认端口号。可参考我主页文章杀死占用了8080的进程…

CSA笔记4-包/源管理命令以及本地光盘仓库搭建

包/源管理命令 1.rpm是最基础的rmp包的安装命令,需要提前下载相关安装包和依赖包 2.yum/dnf是基于rpm包的自动安装命令,可以自动在仓库中匹配安装软件和依赖包 注意:以上是安装命令,以下是安装源 3.光盘源:是指安装系统时后的…

Pytorch TensorBoard的使用

from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs")for i in range(100):writer.add_scalar("yx",i,i) writer.close() 第一个参数 y2x: 这是图表的标题或标签。它会显示在TensorBoard界面中,帮助你识别这条曲线。 第二个参…

【分布式锁】Redission实现分布式锁

接着上一节,我们遇到了超卖的问题,并通过Redis实现分布式锁,进行了解决。本节 我将换一种方式实现分布式锁。 前提: nginx、redis、nacos 模块1: provider-and-consumer 端口 8023 模块2 rabbitmq-consumer 端口 8021 …

opencascade AIS_InteractiveContext源码学习9 obsolete methods

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

CSS3雷达扫描效果

CSS3雷达扫描效果https://www.bootstrapmb.com/item/14840 要创建一个CSS3的雷达扫描效果,我们可以使用CSS的动画(keyframes)和transform属性。以下是一个简单的示例,展示了如何创建一个类似雷达扫描的动画效果: HTM…

使用uniapp开发小程序(基础篇)

本文章只介绍微信小程序的开发流程,如果需要了解其他平台的开发的流程的话,后续根据情况更新相应的文章,也可以根据uniapp官网的链接了解不同平台的开发流程 HBuilderX使用:https://uniapp.dcloud.net.cn/quickstart-hx.html 开发工具 开始…

Go基础编程 - 11 - 函数(func)

接口(interface) 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用(defer)4.1 defer特…

C++客户端Qt开发——Qt窗口(工具栏)

2.工具栏 使用QToolBar表示工具栏对象&#xff0c;一个窗口可以有多个工具栏&#xff0c;也可以没有&#xff0c;工具栏往往也可以手动移动位置 ①设置工具栏 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<…

责任链模式的应用与解析

目录 责任链模式责任链模式结构责任链模式适用场景责任链模式优缺点练手题目题目描述输入描述输出描述题解 责任链模式 责任链模式&#xff0c;亦称职责链模式、命令链&#xff0c;是一种行为设计模式&#xff0c;允许你将请求沿着处理者链进行发送。收到请求后&#xff0c;每…

H3CNE(OSPF动态路由)

7.1 静态路由的缺点与动态路由分类 7.1.1 静态路由的缺点 7.1.2 动态路由的分类 OSPF运行的机制&#xff1a; 1. 每个设备产生LSA后&#xff0c;都会与其他的设备同步LSA&#xff0c;通过OSPF的报文&#xff0c;去发送与接受其他的LSA&#xff0c;最终目的是每个设备都有全网所…

【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘

ModuleNotFoundError: No module named ‘requests‘ 目录 ModuleNotFoundError: No module named ‘requests‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&a…

Java面试题(每日更新)

每日五道&#xff01;学会就去面试&#xff01; 本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单&#xff0c;下面一起进入主题吧。 目录 1.概述 2.Java 基础 2.1 JDK 和 JRE 有什么区别&#xff1f; 2.2 和 equals 的区别是什么&#xff1f; 2.3 两个对象的…