Spring Aop 源码解析(下)

news2024/11/16 0:16:59

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动态代理 一行代码搞定

参数:类加载器,添加的接口,传的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了

理由如下:

====================================================================&

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

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

相关文章

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

HashMap---数据结构

目录 一、基本数据结构 二、树化与退化 三、索引计算 四、put方法和扩容 五、并发问题 六、key的设计 一、基本数据结构 在jdk1.7版本的时候&#xff0c;hashmap结构主要是使用数组 链表的格式&#xff0c;而在jdk1.8版本中&#xff0c;hashmap的数据结构增加了一种“红黑…

小红书矩阵批量发布工具,一键发布笔记软件

昨日&#xff0c;我收到了一条充满渴望与期待的私信&#xff0c;来自一位小红书的矩阵账号博主。他手握多个账号&#xff0c;渴望寻找一款能够助力他批量发布笔记的神器&#xff0c;每日能够轻松达到百篇的发布量。这份迫切的需求&#xff0c;我深感体会&#xff0c;因为这正是…

node node-sass sass-loader版本对应问题,对于npm编译大家经常遇到版本不对应导致编译报错的问题

问题对应项目 gitee源代码地址&#xff1a; https://gitee.com/qingplus 演示项目 1.查看本地node版本 cmd 进入控制台 node -v具体对应版本如下图 NodeJSSupported node-sass versionNode ModuleNode 209.0115Node 198.0111Node 188.0108Node 177.0, <8.0102Node 166…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅱ)

1.数据查询 SELECT [ ALL | DISTINCT] <目标列表达式>[&#xff0c;<目标列表达式>] … FROM <表名或视图名>[&#xff0c; <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY…

数据分析POWER BI之power query

1.导入数据 ctrla全选--数据--获取数据--其他来源--来自表格/区域 导入数据&#xff0c;进入编辑模式 2.整理与清除 清除&#xff1a;删除所选列的非打印字符 转换--格式--清除 修整&#xff1a;删除前面和后面的空格 转换---格式---修整&#xff08;修整后前面后面的空格没有了…

【研发管理】产品经理知识体系-战略

导读&#xff1a;了解和掌握产品经理知识体系-战略是产品经理必修课。战略在产品创新管理框架中核心位置。本文概要梳理战略相关知识内容&#xff0c;仅供大家参考。 目录 1、战略定义 1.1 战略金字塔 1.2 战略的层级总表 1.3 战略跟战术的关系 1.4 愿景、使命和价值观​编…

Pillow教程05:NumPy数组和PIL图像的相互转化

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

uni-app框架(项目创建)

1.学习说明 dcloud官方除uni-app外&#xff0c;还有新生的uni-app x&#xff08;即下一代uni-app&#xff09;&#xff0c;如果是初学者或者刚入门同学&#xff0c;建议还是使用uni-app进行开发。 无论是vue还是uni&#xff0c;作为前端开发的一个框架学习方法是一致的&#…

扩展自动化,超越RPA的局限

白皮书大纲 01 概述 02 端到端流程超越节省的时间 03 企业自动化与机器人流程自动化的对比 04 将RPA集成到企业工作流程中 05 实现端到端自动化——构建流程 06 中枢神经系统&#xff1a;一个编排平台 07 结合RPA和数环通iPaaS的益处 01 概述 企业运营依赖于流程。有效的流程是…

城市排涝与海绵城市规划设计中的水文水动力模拟技术应用

随着计算机的广泛应用和各类模型软件的发展&#xff0c;将排水系统模型作为城市洪灾评价与防治的技术手段已经成为防洪防灾的重要技术途径。本次培训将聚焦于综合利用GIS及CAD等工具高效地进行大规模城市排水系统水力模型的建立&#xff0c;利用SWMM实现排水系统水力模拟。讲解…

FastAPI+React全栈开发02 什么是FARM技术栈

Chapter01 Web Development and the FARM Stack 02 What is the FARM stack and how does it fit together? FastAPIReact全栈开发02 什么是FARM技术栈 It is important to understand that stacks aren’t really special, they are just sets of technologies that cover…

政安晨:【Keras机器学习实践要点】(三)—— 编写组件与训练数据

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 介绍 通过 Keras&#xff0c;您可以编写自定…

【数据结构】顺序表的定义

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

【牛客】SQL142 对试卷得分做min-max归一化

描述 现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间&#xff09;&#xff1a; idexam_idtagdifficultydurationrelease_time19001SQLhard602020-01-01 10:00:0029002Chard802020-01-0…

SQLite使用的临时文件(二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite数据库文件损坏的可能几种情况 下一篇&#xff1a;SQLite数据库成为内存中数据库&#xff08;三&#xff09; ​ 1. 引言 SQLite的显着特点之一它是一个数据库由一个磁盘文件组成。 这简化了 SQLite 的使用…

【动态规划】Leetcode 62. 不同路径

【动态规划】Leetcode 62. 不同路径 解法 ---------------&#x1f388;&#x1f388;62. 不同路径 题目链接&#x1f388;&#x1f388;------------------- 解法 &#x1f612;: 我的代码实现> 动规五部曲 ✒️确定dp数组以及下标的含义 dp[i][j] 走到i, j这个格子的…

Open WebUI大模型对话平台-适配Ollama

什么是Open WebUI Open WebUI是一种可扩展、功能丰富、用户友好的大模型对话平台&#xff0c;旨在完全离线运行。它支持各种LLM运行程序&#xff0c;包括与Ollama和Openai兼容的API。 功能 直观的界面:我们的聊天界面灵感来自ChatGPT&#xff0c;确保了用户友好的体验。响应…

(四)图像的%2线性拉伸

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…

Netty剖析 - 掌握Netty 整体架构脉络

文章目录 Netty 整体结构Core 核心层Protocol Support 协议支持层Transport Service 传输服务层 Netty 逻辑架构网络通信层事件调度层服务编排层组件关系梳理 Netty 源码结构Core 核心层模块Protocol Support 协议支持层模块Transport Service 传输服务层模块 思维导图 Netty 整…