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

2023-09-14 20:01:47

一、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。只要生成过代理类都会被缓存,所以这个方法才是检测一个类是否是代理类的唯一标准。

更多推荐

文章采集,根据标题全网采集文章

无论您是一名学生、研究人员、内容创作者还是企业家,都需要从互联网上搜集文章来获取有价值的信息。然而,如何高效地进行文章采集并找到符合您需求的内容呢?在日常生活和工作中,我们经常需要查找和整理各种文章和信息。这可能包括研究论文、市场分析、竞争对手的信息、新闻报道等等。然而,互联网上的信息海量且分散,如何快速、高效地进行文

python操作windows桌面实现鼠标、键盘操作,python之pyautogui库文档详解

文章目录一、概述1、概述2、安装二、屏幕操作1、获取屏幕分辨率2、某个坐标是否在屏幕上3、获取当前鼠标位置三、鼠标操作1、移动鼠标2、点击操作3、滚轮操作4、记录光标小程序5、鼠标拖拽6、缓动/渐变(Tween/Easing)函数99、保护措施(FAILSAFE)99、延迟操作(PAUSE)四、键盘操作1、输入操作2、

Socks5与HTTP的区别与应用场景

在网络访问中,代理服务器扮演着重要角色,用于保护用户隐私、提高访问速度等。Socks5代理和HTTP代理是两种常见的代理协议,它们在功能和应用场景上有所不同。本文将深入解析Socks5代理和HTTP代理的区别,帮助您更好地了解并选择适合自己需求的代理服务。一、Socks5代理1.功能特点:Socks5代理是一种通用的代

【笔试强训选择题】Day42.习题(错题)解析

作者简介:大家好,我是未央;博客首页:未央.303系列专栏:笔试强训选择题每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!文章目录前言一、Day42习题(错题)解析总结前言一、Day42习题(错题)解析1.解析:C题目解析:选项A:选项B:不仅有单播地址,多播地址,还有广播地址;选项C:一个主机可以有

理解Nginx反向代理详解

什么是Nginx反向代理?Nginx是一个高性能的开源Web服务器,但它也可以用作反向代理服务器。反向代理是一种服务器配置,它允许Nginx接收客户端请求,然后将这些请求转发到后端服务器,最终将响应返回给客户端。这种配置对于负载均衡、安全性和性能优化非常有用。为什么前端需要理解Nginx反向代理?请求转发:Nginx转

趣解设计模式之《小王与他的Apple商店》

〇、小故事小王开了一个Apple商店,每天销售量都很不错,但是,近期却有一件事让他很苦恼,那就是针对不同的角色用户,商品的售价是各不同的。比如说,对于普通消费者来说,对于最新的Apple产品,都是原价销售的;那么,对于学生消费群体来说,由于每年开学都会有高校折扣的政策,为了减少学生客户群体的购买压力,是在原价的基础上打

C++之智能指针类型转换应用总结(二百二十九)

简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注:Android系统攻城狮1.前言本篇目的:理解C+

CSS选择器练习小游戏

请结合CSS选择器练习小游戏进行阅读(网页的动态效果是没有办法通过静态图片展示的)网址:请点击有些题有多种答案,本文就不一一列出了第一题答案:plate第二题答案:bento第三题答案:#fancy第四题答案:plateapple或者plate>apple第五题答案:#fancypickle第六题答案:.small或者

【校招VIP】产品基础知识之学习渠道

考点介绍:产品经理是一项复合型的工作,需要学习掌握的知识很多,能否通过学习掌握并构建一套属于自己的产品知识体系,是成为一名优秀产品经理的重要条件。系统化学习方法,可以分为以下6个步骤:1、明确的学习目标。2、梳理知识框架,画出知识体系的枝干。3、各个击破,逐步学习掌握分支知识。4、在实践中应用,形成产品思维方式。5、在

WMS仓储管理系统:从集成到面向未来的策略

现代供应链需求对WMS仓储管理系统形成了一系列复杂而又严格的要求,并且面临的挑战日益增多。WMS仓储管理系统需要与不同地区、不同业务以及其他的合作伙伴进行交互,从供应商到制造商,再到运输商和客户,一切都需要与WMS系统进行交互。还有,仓库系统本身不是静态的,它即是物理的,又依赖众多的玩家和渠道,它也在不断进化以满足市场

【Java】JDK8 jvm参数配置及说明

参数说明1.堆内存参数设置-Xms或-XX:InitialHeapSize=n设置堆的初始值指令1:-Xms2g指令2:-XX:InitialHeapSize=2048m-Xmx或-XX:MaxHeapSize=n设置堆区最大值指令1:-Xmx2g指令2:-XX:MaxHeapSize=2048m-XX:NewSize

热文推荐