Cglib代理和JDK代理原理的区别

news2024/12/23 14:44:05

一、JDK

Jdk动态代理,拿到目标类所继承的接口,生成代理类,并且代理类也会实现和目标类一样的接口。

二、Cglib

Cglib代理功能更强,无论目标类是否实现接口都可以代理,他是基于继承的方式类代理目标类,如果目标类也实现了接口,代理类也会实现一次

public Object getProxy(@Nullable ClassLoader classLoader) {
		Class<?> rootClass = this.advised.getTargetClass();//目标类
        Class<?> proxySuperClass = rootClass;
       
        if (rootClass.getName().contains("$$")) { //如果目标类也是一个代理类,那么就拿到这个代理类的父类,因为这个代理类的父类,才是我们真正要代理的目标类。然后继承他
            proxySuperClass = rootClass.getSuperclass();
            Class<?>[] additionalInterfaces = rootClass.getInterfaces();//如果目标类是一个代理类,那么这个代理实现的接口,也就是新的代理类要实现的接口。
            this.advised.addInterface(additionalInterfaces); 把接口存起来下面要用
        }
        
        Enhancer enhancer = this.createEnhancer();
        enhancer.setSuperclass(proxySuperClass);  //设置代理的父类,可能是目标类的类型,可能是目标类的父类。
        enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));  //设置新的代理类要实现的接口。
        //必实现的接口SpringProxy,如果是切面还会实现Advised
        
        enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
        enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader));
        Callback[] callbacks = this.getCallbacks(rootClass);
        Class<?>[] types = new Class[callbacks.length];
        。。。。。
}

三、如何选择

那么在Spring创建代理对象的时候是选择Cglib还是Jdk有一段代码

//判断是否是接口或者是否是代理类
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    new JdkDynamicAopProxy(config)
} else {
    new ObjenesisCglibAopProxy(config)
}

public static boolean isProxyClass(Class<?> cl) {
    return Proxy.class.isAssignableFrom(cl) && proxyClassCache.containsValue(cl);
}

Proxy.class.isAssignableFrom(cl)就是判断cl所表示的类是不是SpringProxy或者SpringProxy的子类。因为所有的代理类都会继承SpringProxy,所以这个条件必须满足。满足这个条件也不能保证就是代理类,因为可能存在人为地编写一个类继承SpringProxy。proxyClassCache.containsValue(cl)这个方法是检查缓存中是否存在这个Class实例cl。只要生成过代理类都会被缓存,所以这个方法才是检测一个类是否是代理类的唯一标准。

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

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

相关文章

23下半年学习计划

大二上学期计划 现在已经是大二了&#xff0c;java只学了些皮毛&#xff0c;要学的知识还有很多&#xff0c;新的学期要找准方向&#xff0c;把要学的知识罗列&#xff0c;按部就班地完成计划&#xff0c;合理安排时间&#xff0c;按时完成学习任务。 学习node.js&#xff0c…

Python Opencv实践 - HoG特征计算

参考资料&#xff1a;https://www.cnblogs.com/alexme/p/11361563.html https://blog.csdn.net/qq_43348528/article/details/108638030 import cv2 as cv import numpy as np import matplotlib.pyplot as plt from skimage import exposure from skimage.feature i…

线段树上树剖再拿线段树维护:0914T4

cp 一种常见套路&#xff1a; 如果在线段树上进行一段区间修改&#xff0c;那么必然是一段右节点一段左节点 这个过程其实就是zkw的本质 下面都要用zkw来理解 考虑原题&#xff0c;有一棵不规则的线段树 类似zkw&#xff0c;在这类题目中&#xff0c;我们要先把开区间变成闭…

华为云Stack的学习(六)

七、华为云Stack计算服务介绍 1.计算服务整体介绍 2.弹性云服务器ECS ECS&#xff08;Elastic Cloud Server&#xff09;&#xff0c;即弹性云服务器&#xff0c;是由vCPU、内存、磁盘等组成的&#xff0c;获取方便、弹性可扩展、按需使用的、虚拟的计算服务器。 ECS只需要花…

【深度学习】 Python 和 NumPy 系列教程(十四):Matplotlib详解:1、2d绘图(下):箱线图、热力图、面积图、等高线图、极坐标图

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 0. 设置中文字体 1-5. 折线图、散点图、柱状图、直方图、饼图 6. 箱线图&#xff08;Box Plot&#xff09; 7. 热力图&#xff08;Heatmap&#xff09; 8. 面积图&#xff08;Area Plot&#xff09; 9. 等…

Zabbix“专家坐诊”第203期问答汇总

问题一 Q&#xff1a;用的模板&#xff0c;没用创建动作&#xff0c;但是触发器触发了我钉钉直接被通知了&#xff0c;怎么取消模板自带的动作&#xff1f; A&#xff1a;没有动作是不会触发事件告警的 &#xff0c;确定是从这个平台推出的钉钉消息&#xff1f;或者看下zabbix…

【操作系统】进程的通信IPC

进程通信是指进程之间的信息交换。 低级通信方式&#xff1a;PV操作 高级通信方式&#xff1a;1.共享存储2.消息传递3.管道通信 共享存储 低级数据结构共享&#xff0c;高级存储区共享。 对共享空间进行读写操作时&#xff0c;需要用到互斥工具。 消息传递 利用发送消息和…

Leetcode算法入门与数组丨3. 数组基础

文章目录 前言1 数组简介2 数组的基本操作2.1 访问元素2.2 查找元素2.3 插入元素2.4 改变元素2.5 删除元素 3 总结task03task04 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客是一个 入门型 的文章&#xff0c;主要是自己学习的一个记录。 内容会参…

Matlab图像处理-三原色

三原色 根据详细的实验结果&#xff0c;人眼中负责颜色感知的细胞中约有65%对红光敏感&#xff0c;33%对绿光敏感&#xff0c;只有2%对蓝光敏感。正是人眼的这些吸收特性决定了所看到的彩色是一般所谓的原色红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;和蓝&…

十四、流式编程(1)

本章概要 流支持流创建 随机数流int 类型的范围generate()iterate()流的建造者模式Arrays正则表达式 集合优化了对象的存储&#xff0c;而流&#xff08;Streams&#xff09;则是关于一组组对象的处理。 流&#xff08;Streams&#xff09;是与任何特定存储机制无关的元素序列…

【2023】windows下安装libevent

Windows安装libevent 1.安装Visual Studio2.安装openssl第一种安装方式&#xff1a;[简便安装](https://slproweb.com/products/Win32OpenSSL.html)第二种&#xff1a;自己编译openssl 3.libevent下载libevent修改文件1.下边三个文件加入宏定义 #define _WIN32_WINNT 0x05002.修…

基于卷积神经网络的手写字体识别(详细笔记)

主要参考博客&#xff1a; 1、 基于卷积神经网络的手写数字识别&#xff08;附数据集完整代码操作说明&#xff09; 2、用PyTorch实现MNIST手写数字识别&#xff08;最新&#xff0c;非常详细&#xff09; 基于卷积神经网络的手写字体识别——目录 1 前言1.1 实现效果1.2 学习背…

国产洗碗机打响超越战

“征服世界的将是这样一些人&#xff1a;开始的时候&#xff0c;他们试图找到梦想中的乐园。最终&#xff0c;当他们无法找到时&#xff0c;就亲自创造了它。”诺贝尔文学奖获得者萧伯纳的这句话&#xff0c;适用于许多中国行业和企业&#xff0c;洗碗机就是其中之一。 对热爱…

十进制小数转换为单双精度浮点数方法

1 将十进制小数转换为单精度浮点数的方法如下&#xff1a; 2. 将十进制小数转换为双精度浮点数的方法如下&#xff1a; 和单精度浮点值转换一样

前端Layui框架介绍

当涉及到前端UI框架时&#xff0c;Layui&#xff08;简称layui&#xff09;是一个备受欢迎的框架之一。在这篇博客中&#xff0c;我们将深入了解layui&#xff0c;包括其市场占有率、开发语言、使用场景、框架特点以及一些使用案例。 1. 市场占有率 Layui 是一款流行的前端UI框…

(纯干货建议收藏)大型字符串模拟-超强超全函数技巧总结

这篇文章将会总结一些处理字符串、进制转换等等的常见的、非常有用的技巧和函数。后续会随时更新本文章&#xff0c;希望大家收藏、留言&#xff0c;一起学习进步&#xff01; 对于特别简单的函数&#xff0c;就不写函数的详细原型啦&#xff01; 具体包含四部分&#xff0c;…

Xilinx FPGA未使用管脚上下拉状态配置(ISE和Vivado环境)

文章目录 ISE开发环境Vivado开发环境方式1&#xff1a;XDC文件约束方式2&#xff1a;生成选项配置 ISE开发环境 ISE开发环境&#xff0c;可在如下Bit流文件生成选项中配置。 右键点击Generate Programming File&#xff0c;选择Process Properties&#xff0c; 在弹出的窗口选…

《程序员职场工具库》如何优化你的工作 —— PDCA 循环

PDCA 循环简介 PDCA 循环是一种以持续改进为核心思想的管理方法&#xff0c;在全球各个领域得到广泛的应用。它还有好几个别称&#xff0c;叫“质量环”&#xff0c;也叫“戴明环”&#xff0c;也有叫“持续改进螺旋”。 PDCA 循环由四个步骤组成&#xff1a; 计划&#xff…

基于SSM+Vue的中国咖啡文化宣传网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用vUE技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

vector模拟实现——关于模拟中的易错点

前言 vector 本质上类似数组&#xff0c;也可以理解为一种泛型的 string。string 只能存储 char 类型&#xff0c;但是 vector 支持各种内置类型和自定义类型。本次将围绕模拟实现 vector 中遇到的问题进行分析。 文章目录 前言一、确定思路二、实现过程2.1 查阅文档2.2 验证…