Spring学习05-[AOP学习-AOP原理和事务]

AOP原理和事务

  • AOP
    • AOP底层原理
      • 比如下面的代码案例手动模拟AOP
    • 动态代理详解
      • JDK动态代理
        • 具体实现

AOP

AOP底层原理

在这里插入图片描述

当实现了AOP,Spring会根据当前的bean创建动态代理(运行时生成一个代理类)
面试题:为什么执行方法的时候,会执行切面里的通知方法?

比如下面的代码案例手动模拟AOP

  • 模拟切面类
@Component
public class LogAspect {public void logBefore() {System.out.println("aop前置通知");}public void logAfter(){System.out.println("aop后置通知");}public void logReturn(){System.out.println("aop返回通知");}public void logThrowting(){System.out.println("aop异常通知");}}
  • 动态代理类
@Component
public class ProxyUserService extends UserService {@Autowiredprivate LogAspect logAspect;@Overridepublic String add() throws InterruptedException {String result = null;try {//调用切面类-前置通知logAspect.logBefore();//调用目标方法result = super.add();//调用切面类返回通知logAspect.logReturn();} catch (Exception e) {//调用切面类-异常通知logAspect.logThrowting();e.printStackTrace();} finally {//调用切面类-后置通知logAspect.logAfter();}return result;}
}

在这里插入图片描述
为什么断点可以进入切面类中的通知方法中?
从上述代码中可以看到,在AOP动态代理中,在Spring代理类中,帮我们调用了切面中的前置通知,后置通知、返回通知、异常通知这些通知方法,所以断点可以进入。

动态代理详解

  • jdk动态代理
  • cglib动态代理

JDK动态代理

JDK动态代理是基于接口的

  • 核心代码

第一个参数:类加载器
第二个参数:需要代理的接口
第三个参数:InvocationHandler(调用程序处理器,必须重写invoke方法)

Proxy.newProxyInstance(TestJdkProxy.class.getClassLoader(),UserService.class.getInterfaces(),new MyHandler(new UserService()));
具体实现
  • 接口
public interface IUserService {void add();
}
  • 实现类
public class UserService implements IUserService{@Overridepublic void add() {System.out.println("添加用户");}
}
  • 自定义一个InvocationHandler(目的是优化代码降低耦合,提高代码维护性)
public class MyHandler implements InvocationHandler {Object target;public MyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("执行前置通知");//执行目标方法Object returnValue = method.invoke(target, args);System.out.println("执行后置通知");return returnValue;}
}
  • 测试
@Component
public class TestJdkProxy{public void test(){IUserService instance = (IUserService) Proxy.newProxyInstance(TestJdkProxy.class.getClassLoader(),UserService.class.getInterfaces(),new MyHandler(new UserService()));instance.add();}
}

在这里插入图片描述

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

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

相关文章

华为机试HJ40统计字符

华为机试HJ40统计字符 题目: 想法: 统计上述题目中的四种字符的个数存入字典中,按指定顺序进行输出 input_str input()str_dict {"alpha": 0, "space": 0, "number": 0, "others": 0}for i in …

ZYNQ-LINUX环境C语言利用Curl库实现HTTP通讯

前言 在Zynq-Linux环境中,需要使用C语言来编写APP时,访问HTTP一般可以使用Curl库来实现,但是在Zynq的SDK中,并没有集成该库,在寻找了很多资料后找到了一种使用很方便的额办法。这篇文章主要记录一下移植Curl的过程。 …

【2024_CUMCM】数据预处理、数据分析、数据可视化

目录 2023-c题-问题1 问题分析 偏度 峰度 箱线图 读图 重采样、降采样、升采样 重采样 降采样 升采样 解题代码 2023-c题-问题1 问题分析 问题说白了就是探究品类和销售量这两个数据他们各自内在联系,根据题意,我们先进行数 据预处理&#…

【C语言】 —— 编译和链接

【C语言】 —— 编译和链接 一、编译环境和运行环境二、翻译环境2.1、 预处理2.2、 编译(1)词法分析(2)语法分析(3)语义分析 2.3、 汇编2.4、链接 三、运行环境 一、编译环境和运行环境 平时我们说写 C语言…

C语言中32位浮点数的格式

以 GNU C为例,它遵循 IEEE 754-2008标准中制定的浮点表示规范。在该规范中定义了 5种不同大小的基础二进制浮点格式,包括:16位,32位,64位,128位,256位。其中,32位的格式被用作标准 C…

使用AOP思想实现开闭原则下的流水日志输出

主要实现思想: 通过实现Convert接口来抽取公共组件,获取想要的标准模型。 现在有两个订单场景,一个保存订单,一个为更新订单。构造如下的服务类: import org.springframework.stereotype.Service;Service public clas…

JavaScript-实例-button

1 需求 2 接口 3 点击button跳转到一个页面 在HTML中&#xff0c;当你想要点击一个按钮并跳转到另一个页面时&#xff0c;通常你可以使用<a>标签来包裹按钮的样式&#xff08;尽管这通常不是最佳实践&#xff0c;因为<a>标签是用于链接的&#xff0c;而<button&…

SHAP(SHapley Additive exPlanations)基于XGBoost模型的可解释机器学习

模型可解释性 这是一个关于错误解释机器学习模型的危险以及正确解释它的价值的故事。如果您发现诸如梯度提升机或随机森林之类的集成树模型的鲁棒准确性很有吸引力&#xff0c;但也需要解释它们&#xff0c;那么我希望您发现这些信息有用且有帮助。 试想一下&#xff0c;我们…

julia系列17: tsp问题代码整理

1. 常用库和基础函数 这里是优化版的函数&#xff1a; using TSPLIB,LKH,Distances,PyPlot MaxNum 10000 tspreadTSPLIB(:att48) dist [round.(Int,euclidean(tsp.nodes[i,:],tsp.nodes[j,:])) for i in 1:tsp.dimension,j in 1:tsp.dimension]; pos(tsp::TSP,t::Vector{In…

Groovy中,多种循环方式

1.最常规的for循环 for (def i 0; i < 5; i) { //这个i需要声明println "遍历输出${i}" }2.while循环 def j 0 while (j < 5) {println "遍历输出 ${j}"j }3.for in 循环 def list [0, 1, 2, 3, 4] //这个l无需声明 for (l in list) { printl…

uniapp跨域问题解决

找到menifest文件&#xff0c;在文件的最后添加如下代码&#xff1a; // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…

数据库的存储引擎,数据类型,约束条件,严格模式

【一】存储引擎 1.什么是存储引擎存储引擎可以理解为处理数据的不同方式 2.查看存储引擎show engines; 3.须知的引擎MyISAM5.5之前版本MySQL默认的存储引擎特点:存取数据的速度快 但是功能很少 安全性较低速度快因为自带索引InnoDB5.5之后版本MySQL默认的存储引擎特点:有诸多功…

工程施工合同无效但竣工交付,应当参照合同关于工程价款的约定计算折价补偿款

审判实践中&#xff0c;对于建设工程施工合同无效但工程竣工并交付使用的&#xff0c;应以何种标准计算折价补偿款的问题&#xff0c;认识不一致。【法官会议意见】&#xff1a;建设工程施工合同是承包人进行工程建设、交付工作成果即建设工程并由发包人支付价款的合同。建设工…

httpd目录显示乱码问题

vim /etc/httpd/conf/httpd.conf 在<Directory “/var/www/html”>下添加&#xff1a; IndexOptions CharsetUTF-8重启httpd: systemctl restart httpd.service还是不好看&#xff0c;调整下显示宽度&#xff0c;还是这个位置&#xff1a; <Directory “/var/www/ht…

区块链论文速读A会-ISSTA 2023(2/2)如何检测DeFi协议中的价格操纵漏洞

Conference&#xff1a;ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2023 第1~5篇区块链文章 请点击此…

09视图,触发器,事务,存储过程,函数,流程控制,索引,隔离机制,锁机制,三大范式

【一】视图 (1)视图须知概念 1.什么是视图&#xff1f; 视图就是通过查询得到一张虚拟表&#xff0c;然后保存下来&#xff0c;下次可以直接使用 2.为什么要用视图&#xff1f; 如果要频繁操作一张虚拟表(拼表组成)&#xff0c;就可以制作成视图&#xff0c;后续直接操作 注意…

IDEA 创建springboot项目杂记-更新中

一、工具使用杂记 1、使用maven 创建新springboot项目时&#xff0c;因为https://start.spring.io/ 连接不上项目无法创建。直接把脚手架地址换为国内的 http://start.aliyun.com

田忌赛马 贪心

本题是更难的那道,一场50 最低为o 第一行一个整数 &#x1d45b;n &#xff0c;表示他们各有几匹马&#xff08;两人拥有的马的数目相同&#xff09;。第二行 &#x1d45b;n 个整数&#xff0c;每个整数都代表田忌的某匹马的速度值&#xff08;0≤0≤ 速度值 ≤100≤1…

Python】从文本字符串中提取数字、电话号码、日期、网址的方法

关于从文本字符串中提取数字、电话号码、日期和网址的方法&#xff1a; 提取数字&#xff1a; 在 Python 中&#xff0c;使用正则表达式 \d 来匹配数字。 \d 表示匹配一个数字字符&#xff08;0-9&#xff09;。如果要匹配连续的数字&#xff0c;可以使用 \d 。 import re def …

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…