Spring Aop 源码解析(下)

ProxyFactory选择cglib或jdk动态代理原理

ProxyFactory在生成代理对象之前需要决定到底是使用JDK动态代理还是CGLIB技术:

config就是ProxyFactory对象,把自己传进来了,因为ProxyFactory继承了很多类,其中一个父类就是ProxyConfig

// config就是ProxyFactory对象

// 是不是运行在GraaJVM上面 如果是就用的JDK动态代理
// optimize为true,或proxyTargetClass为true,或用户没有给ProxyFactory对象添加interface
// Optimize默认是false 可以设置为ture,早期版本cglib工作效率高于jdk 后面就差不多了
// isProxyTargetClass()意思是你要代理的是不是类?设置为true 底层就只用cglib 默认false
// 因为jdk只能代理接口,底层就不会关心你传进来的是接口还是类,就算proxyFactory.addInterface()开启接口代理也没用
if (config.isOptimize() || config.isProxyTargetClass() 
    // 判断当前proxyFactory有没有addInterface() 如果添加了 就返回false 调用jdk动态代理
    // 不会去真正看你的被代理类上是否真的实现了接口 这里之后spring就做了优化
    || hasNoUserSuppliedProxyInterfaces(config)) {
	Class<?> targetClass = config.getTargetClass();
	if (targetClass == null) {
		throw new AopConfigException("TargetSource cannot determine target class: " +
				"Either an interface or a target is required for proxy creation.");
	}
    // 如果被代理的类targetClass是接口,直接使用Jdk动态代理
	if (targetClass.isInterface() 
        // 你设置的类是不是jdk动态代理产生的代理类【非常少用】
        || Proxy.isProxyClass(targetClass)) {
		return new JdkDynamicAopProxy(config);
	}
    // 使用Cglib
	return new ObjenesisCglibAopProxy(config);
}
else {
    // 使用Jdk动态代理
	return new JdkDynamicAopProxy(config);
}

针对上面第18行

// 如果被代理的类targetClass是接口,直接使用Jdk动态代理

99%不会这么使用 无需掌握 会报错

因为没有设置target,被代理的是哪个对象,它咋增强。。target都是灰色的

总结:

运行在GraaJVM,开启了优化isOptimize,isProxyTargetClass传的代理是不是个类【而不是接口】,hasNoUserSuppliedProxyInterfaces看proxyFactory是不是调用了addInterface()方法,如果以上符合任意一个就会用cglib动态代理,否则用的就是jdk动态代理。

所以在ProxyFactory生成代理对象前会去判断用的哪个动态代理,选定好技术后再调用getProxy()去产生真正的代理对象

JDK动态代理 一行代码搞定【底层就调用newProxyInstance 一模一样 传入类加载器 接口 方法拦截器】

参数:类加载器,添加的接口,传的invokationHandler是this

这里advised其实是proxyFactory,拿到proxyFactory设置的TargetSource,拿到被代理对象然后判断当前执行的啥方法

像equals、hashCode这种方法是不会执行advice的代理逻辑的

如果为true会把代理对象放到ThreadLocal里去

具体可以在proxyFactory设置这个属性,设置为true

只要在当前线程 通过AppContext 可以拿到当前的代理对象了。那这个功能有啥用呢???

可以用于@Transcation失效的场景,自己把它取出来用。例如自己注入自己那个解决事务失效的办法其实也可以用这个方法

取出被代理对象

传入当前正在执行的方法,当前被代理的类到proxyFactory【也就是这里的advised属性】,在getInterceptorsAndDynamicInterceptionAdvice方法里筛选,筛选出符合当前方法和类的advice

我可以添加很多Advisor

先会执行Advice链路,再去执行被代理对象target的方法

如果没有筛选出来,就说明没有代理逻辑要执行,就直接执行被代理的方法

如果有advice就把得到的代理对象,被代理对象,当前执行的方法,参数,被代理的类,以及筛选出来的传进去,然后执行

小总结

由ProxyFactory产生的代理对象底层怎么执行的?

代理对象在执行某个方法的时候,首先取出TargetSource,判断当前执行的方法是什么,如果是equals,hashCode这些就不走代理逻辑,直接执行被代理的方法。如果exposeProxy设置为true会放到TheardLocal里面去,然后调用TargetSource的getTarget方法 取出真正的被代理对象【可以自己实现】,然后筛选匹配的Advice和advisor然后去执行

筛选的详细逻辑

不是每次执行方法都要去找,这里会有个缓存 ,方法作为key

MethodInterceptor非常灵活,底层也用的这个

底层你添加的Advice最后都会转成MethodInterceptor,

config就是ProxyFactory,取出所有的Advisors,那advice去哪了?其实早就把那advice转成Advisor了

理由如下:

===================

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程、线程、协程与虚拟线程(进程相关)

进程、线程、协程与虚拟线程 这一次我们从头&#xff0c;从最大的先开始说&#xff0c;我们从进程开始&#xff0c;因为内容比较多&#xff0c;所以我们分为几个不同的文章来介绍。先从进程&#xff0c;再从线程&#xff0c;最后介绍协程与虚拟线程。 简介 我们以一张操作系…

A - Environment-Friendly Travel Gym - 102501A

题意&#xff1a;给你一些交通方式和站点&#xff0c;不同的交通方式碳排放不一样&#xff0c;问从起点到终点距离不超过B的路径中最少的碳排放是多少。 思路&#xff1a;二维dijkstra&#xff0c;建图什么的倒不是很难&#xff0c;主要就是对二维dij的理解了&#xff1b; 表示…

h5 tailwind 使用rounded类导致安卓端样式显示有问题

问题&#xff1a; h5 页面使用了tailwindcss插件&#xff0c;运用了rounded 类&#xff0c;发现在ios和安卓上显示不一致&#xff0c;安卓上样式乱了 解决方案&#xff1a; 将默认得rem单位&#xff0c;改为px的单位 原理&#xff1a; 由于tailwindcss里面的默认元素的默认的…

城市内涝治理新突破:慧天【HTWATER】软件,实现城市内涝一维二维耦合模拟

​慧天排水数字化分析平台针对城市排水系统基础设施数据管理的需求&#xff0c;以及水文、水力及水质模拟对数据的需求&#xff0c;实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模拟计算。可以对城市低影响开…

超好用的快捷回复软件

随着直播经济和短视频平台的兴起&#xff0c;品牌营销阵地不再局限于传统的电商巨头——淘宝、天猫、京东和拼多多&#xff0c;越来越多的品牌正积极布局快手、抖音等新晋电商平台&#xff0c;同步打造社群矩阵以拓宽产品推广渠道。这种多维度的市场渗透策略有力地提升了品牌的…

腾讯云2核4G的云服务器性能咋样?支持多少人?

腾讯云轻量应用服务器2核4G5M配置性能测评&#xff0c;腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;并发数10&#xff0c;支持每天5000IP人数访问&#xff0c;腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线&#xff1f;并发数测试、CPU性能、内存性能、…

爬虫基础训练题

1.抓取imooc网站实战课程部分的课程名称&#xff08;所有课程大概7页&#xff0c;抓取1到5页&#xff09;&#xff0c;并把所有课程名称存储为txt文件第一页地址 2.设置一个请求头&#xff08;headers&#xff09;&#xff0c;这是一个字典&#xff0c;用于在HTTP请求中设置请…

Floyd算法:浅显外表下的动态规划内核

很久没遇到Floyd算法的题目了&#xff0c;2642. 设计可以求最短路径的图类刚好是一个典型。在实现核心算法之余&#xff0c;顺便整理一下算法的内核。 Floyd-Warshall’s Algorithm Floyd-Warshall算法&#xff0c;简称Floyd算法&#xff0c;是“有向图非负权图的多源最短路”…

第十届统计建模大赛 ——大数据与人工智能时代的统计研究数据解析

统计建模一般做法&#xff1a;可以采用统计分析方法&#xff0c;先进性数据预处理&#xff0c;再利用深度学习、神经网路方法进行预测。 1.碳排放预测&#xff1a;数据加代码 2.新能源汽车数据 3.太阳辐射数据 4.参考文献 请联系 建模忠哥小师妹

JavaScript 打印教程(第二部分)设置编码

JavaScript 打印教程&#xff08;第二部分&#xff09;设置编码 在进行文本打印时&#xff0c;尤其是涉及到中文或其他特殊字符时&#xff0c;正确的编码设置是非常重要的。不同的打印机支持不同的指令集&#xff0c;因此了解并使用适合您打印机的指令集是关键。本篇教程继续使…

【爬虫基础】第5讲 AJAX动态页面的数据获取

静态&#xff1a;访问地址栏里的数据就可以获取到想要的数据 动态&#xff1a;访问地址栏里的数据获取不到想要的数据 解决方案&#xff1a;抓包 打开浏览器的开发者工具-network-xhr,找到可以获取到数据的URL访问即可 获取url地址 代码实现&#xff1a; from urllib.request…

flask各种版本的项目,终端命令运行方式的实现

目录 写在前面 一、Flask项目的基本结构 二、使用终端命令运行Flask项目 1. 安装Flask 2. 创建Flask应用 3. 配置FLASK_APP环境变量 4. 运行Flask应用 5. 访问Flask应用 三、Flask CLI的其他功能 1. 创建Flask应用 2. 运行开发服务器 3. 清理缓存文件 4. 运行单元…

Spring6 (1)

Spring 1、简介&#xff1a;2、第一个程序2、set注入2.1 简单数据类型2.2测试2.3 注入Properties2.4 p命名空间注入2.5 c命名空间注入2.6 util注入2.6 引入外部配置文件 1、简介&#xff1a; 自己的理解&#xff1a;spring其实就是一个容器&#xff0c;也可以说是一个框架&…

Codeforces Round 936 (Div. 2) ---- E. Girl Permutation ---- 题解 (数论)

E. Girl Permutation&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 先理解什么是前缀最大值&#xff0c;他应该满足什么条件&#xff0c;根据定义可知对于 i 如果满足 所以 j < i&#xff0c;并且有 ai > aj&#xff0c;那么ai就是前缀最大值&#xff0c; 换…

大数据技术之 Apache Doris(一)

第 1 章 Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 10…

MySQL使用教程:数据库、表操作

目录 1. 免密码登录MySQL1.1 免密码配置1.2 登录选项介绍 2. MySQL基础配置&#xff1a;my.cnf3. 开机自启动设置&#xff08;可选设置&#xff09;4. 查看存储引擎5. 查看系统的编码规则和校验规则6. 数据库的操作6.1 查看数据库6.2 创建数据库 create database6.3 删除数据库…

九州金榜|面对校园霸凌,家长应该如何教育?

近期关于校园霸凌事件接连发生&#xff0c;前有邯郸时间&#xff0c;后有福建晋江一中学生因不忍被霸凌&#xff0c;选择跳楼轻生&#xff0c;面对此类事件&#xff0c;接连发生&#xff0c;孩子为什么会成为被霸凌的对象&#xff1f;家长应该如何教育孩子敢于对霸凌时说不。下…

【Java程序设计】【C00374】基于(JavaWeb)Springboot的社区疫情管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

Java Web-Tomcat

Web服务器 Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。 Tomcat&#xff0c;是一个 HTTP 服务器。我们只需要在服务器中安装一个Web服务器如Tomcat&#xff0c;然后就可以将…

js逆向之对称加密west交大登录密码

目录 js逆向之对称加密&west交大登录密码 什么是DES? 什么是AES? 实例演示--某大学官网 找加密? 关键字搜索 第一处: 找到其加密码代码 下断点 扣代码 这js代码怎么运行呢? 如何使用node运行js代码? 下载这个加密算法对象库 引用(对象) 传参 联动pyth…