当前位置: 首页 > news >正文

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

 

相关文章:

Spring框架、02SpringAOP

SpringAOP 日志功能 基本方法 分析代码问题 目前代码存在两个问题 代码耦合性高:业务代码和日志代码耦合在了一起 代码复用性低:日志代码在每个方法都要书写一遍 问题解决方案 使用动态代理,将公共代码抽取出来 JDK动态代理 使用JDK动…...

基于python的网络爬虫爬取天气数据及可视化分析

要创建一个基于Python的网络爬虫来爬取天气数据并进行可视化分析,我们可以采用以下几个步骤来实现: 1. 选择数据源 首先,需要确定一个可靠的天气数据源。常用的有OpenWeatherMap、Weather API、Weatherstack等。这些API通常需要注册并获取一个API密钥(API Key)来使用。 …...

【WPF开发】上位机开发-串口收发

一、引言 在现代工业控制、嵌入式系统等领域,串口通信作为一种常见的通信方式,被广泛应用于各种场景。C#作为一门强大的编程语言,结合Windows Presentation Foundation(WPF)框架,可以轻松实现串口通信功能…...

ubuntu开启 远程登录 允许root远程登录

如果没有22端口服务 sudo apt update sudo apt install openssh-server sudo ufw allow.ssh sudo passwd root 修改配置文件 sudo vim /etc/ssh/sshd_config Port 22 修改为 Port 22 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes service ssh restart …...

《昇思25天学习打卡营第23天|RNN实现情感分类》

使用RNN进行情感分类:基于IMDB数据集的LSTM应用 引言 情感分析是自然语言处理(NLP)中的一个重要应用,广泛用于电影评论、社交媒体等文本数据的情感分类任务。本文将介绍如何使用递归神经网络(RNN)实现情感…...

机械设计基础B(学习笔记)

绪论 机构:是一些具备各自特点的和具有确定的相对运动的基本组合的统称。 组成机构的各个相对运动部分称为构件。构件作为运动单元,它可以是单一的整体,也可以是由几个最基本的事物(通常称为零件)组成的刚性结构。 构件…...

MybatisPlusException: Error: Method queryTotal execution error of sql 的报错解决

项目场景: 相关背景: 开发环境 开发系统时 系统页面加载正常 ,发布运行环境后运行一段时间,前端页面 突然出现 报错信息, 报错信息如下: MybatisPlusException: Error: Method queryTotal execution erro…...

人工智能领域的顶尖影响力人物(部分代表)

人工智能(AI)是模拟人类智能过程的计算机系统或机器的理论和开发。它致力于创建能够执行需要人类智能的任务的机器,如视觉感知、语音识别、决策制定和翻译之间的语言。AI领域包括机器学习、深度学习、自然语言处理等子领域,并涉及…...

Python:jsonl文件转json文件,并做字段处理

在使用LLaMA-Factory对shenzhi-wang/Llama3-8B-Chinese-Chat(https://huggingface.co/shenzhi-wang/Llama3-8B-Chinese-Chat/tree/main)进行微调时,希望使用COIG-CQIA的小红书数据集(https://huggingface.co/datasets/m-a-p/COIG-…...

安全产品在防御勒索病毒中的作用

在数字时代,网络安全威胁日益严峻,其中勒索病毒尤为猖獗,它通过加密受害者的数据并要求赎金换取解密密钥,给个人和企业带来了巨大的经济损失。然而,关于安全产品是否真正有效的问题一直存在争议。本文将通过一个模拟实…...

NVIDIA 完全过渡到开源 GPU 内核模块

目录 支持的 GPU安装程序更改将包管理器与 CUDA 元包配合使用使用 runfile使用安装帮助程序脚本包管理器详细信息apt:基于 Ubuntu 和 Debian 的发行版dnf:Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypper:SUSE …...

learning-cxx 学习cpp 环境配置 + bug解决

学习CPP网址 https://github.com/LearningInfiniTensor/learning-cxx 安装环境 1.配置xmake的环境 xmake是c的构建工具 最简单的配置方法就是安装mcvs,然后选择必要的那两个包 查看版本,是否安装成功 gcc --version g --version2.安装xmake 我的是…...

PHP 多线程和异步编程的常见陷阱

本文由 ChatMoney团队出品 在PHP开发中,多线程和异步编程是提高应用性能和响应速度的重要手段。然而,这些技术也带来了许多挑战和陷阱,如共享状态冲突、死锁、超时、资源泄漏以及调试困难等。本文将详细探讨这些陷阱,并提供相应的…...

STL 哈希 学习总结

概述 基础概念 哈希是通过特定的算法,将任意长度的数据映射为固定长度的数据串中。该映射的结果就被称为哈希值,也可以称为散列值。 例如在存储一个10000这个数据的时候,如果使用数组的话,则需要开辟对应大小空间内存&#xff…...

vue3页面编写-导入导出excel、展开查询项等

数据保持 <router-view v-slot"{ Component, route }"><keep-alive><component :is"Component" :key"route.name" v-if"route.meta.keepAlive" /></keep-alive><component :is"Component" :key…...

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…...

ubuntu20.04安装终端终结者并设置为默认终端

1、安装 terminator sudo apt-get install terminator 2、Ctrl Alt T 试一下打开什么终端&#xff0c;我的默认启动的是terminator;如果想换换默认的终端&#xff0c;还需以下一步 3、安装dconf-tools&#xff0c;这个是设置默认终端的必须 sudo apt-get install dconf-tools…...

以Zookeeper为例 浅谈脑裂与奇数节点问题

一、脑裂现象的定义与影响 脑裂&#xff08;split-brain&#xff09;是指在分布式系统中&#xff0c;因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统&#xff0c;每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点&#xff08;如Elastic…...

最新版kubeadm搭建k8s(已成功搭建)

kubeadm搭建k8s&#xff08;已成功搭建&#xff09; 环境配置 主节点 k8s-master&#xff1a;4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10.16.64.67&#xff09; 从节点 k8s-node1&#xff1a; 4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10…...

C++学习笔记-友元函数的定义与使用

一、引言 在C中&#xff0c;友元函数&#xff08;Friend Function&#xff09;是一个独特而强大的特性&#xff0c;它打破了类的封装性&#xff0c;允许一个或多个非成员函数访问类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员。尽管这…...

告别默认视图:5个CloudCompare点云可视化高级技巧(颜色映射、尺寸分级、OpenGL优化)

告别默认视图&#xff1a;5个CloudCompare点云可视化高级技巧&#xff08;颜色映射、尺寸分级、OpenGL优化&#xff09; 在三维点云处理领域&#xff0c;可视化效果直接影响数据分析的深度与决策效率。CloudCompare作为开源点云处理利器&#xff0c;其默认视图设置往往难以满足…...

H5移动端拍照功能实战:从权限获取到图片上传的完整链路解析

1. 移动端H5拍照功能的核心实现逻辑 在移动端H5页面中实现拍照功能&#xff0c;本质上是通过浏览器API与设备硬件交互的过程。这个功能在在线身份验证、表单提交等场景中非常实用。我做过十几个类似的项目&#xff0c;发现最关键的环节集中在四个步骤&#xff1a;权限获取、视频…...

嵌入式Linux嵌入式Linux驱动开发:板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环

嵌入式Linux嵌入式Linux驱动开发&#xff1a;板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环 仓库已经开源&#xff01;所有教程&#xff0c;主线内核移植&#xff0c;跑新版本imx-linux/uboot都在这里&#xff0c;或者一起来尝试跑7.0的Linux&#xff01;欢迎…...

对比直接使用原生 API 与通过 Taotoken 调用在账单清晰度上的差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用原生 API 与通过 Taotoken 调用在账单清晰度上的差异 对于需要频繁调用多个大语言模型的团队或个人开发者而言&#x…...

Linux主机资产标识实战指南

Linux主机资产标识实战指南本文面向具备一定 Linux 基础的技术人员&#xff0c;围绕主机资产标识展开&#xff0c;重点讨论主机命名、标签规范和资产映射。在中级运维和系统管理工作中&#xff0c;这类主题常常与配置变更、资源状态、权限边界、自动化任务和业务影响交织在一起…...

零基础实战:在AutoDL云端一键部署GPT-SoVITS并实现音色克隆API调用

1. 为什么选择AutoDL部署GPT-SoVITS 第一次接触音色克隆技术时&#xff0c;我和很多人一样被两个问题困扰&#xff1a;本地电脑配置不够怎么办&#xff1f;复杂的Linux环境怎么配置&#xff1f;直到发现AutoDL这个云端算力平台&#xff0c;所有问题迎刃而解。这里实测用RTX3090…...

Real-is-Sim框架:动态数字孪生在机器人控制中的创新应用

1. Real-is-Sim框架概述&#xff1a;动态数字孪生的创新实践在机器人控制领域&#xff0c;仿真到现实的迁移&#xff08;sim-to-real&#xff09;一直是个棘手难题。传统方法往往面临"仿真太完美&#xff0c;现实太复杂"的困境——在虚拟环境中训练的策略&#xff0c…...

快手推荐算法实战解析:从三层漏斗架构到多目标优化

1. 项目概述&#xff1a;从“刷”到“懂”&#xff0c;快手推荐算法的冰山一角 刷快手&#xff0c;可能是很多人每天的习惯性动作。手指一划&#xff0c;一个接一个的短视频&#xff0c;好像总能精准地戳中你的笑点、泪点或是知识盲区。你有没有想过&#xff0c;为什么你看到的…...

信步NSE SVX-C2304嵌入式主板拆解:Elkhart Lake平台在工业边缘计算的应用

1. 项目概述&#xff1a;一块嵌入式主板的深度拆解最近在整理一个工业边缘计算项目的硬件选型方案&#xff0c;手头拿到了一块信步科技&#xff08;Seavo&#xff09;的NSE SVX-C2304嵌入式主板。这名字听起来可能有点“板正”&#xff0c;不像消费级产品那样花哨&#xff0c;但…...

终极指南:如何使用ViGEmBus虚拟游戏控制器驱动程序提升Windows游戏体验

终极指南&#xff1a;如何使用ViGEmBus虚拟游戏控制器驱动程序提升Windows游戏体验 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过想在Win…...