当前位置: 首页 > news >正文

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

一、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,如果是切面还会实现Advisedenhancer.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.lryc.cn/news/166465.html

相关文章:

  • 论文阅读-A General Language for Modeling Social Media Account Behavior
  • Python中的异常处理4-3
  • Swift学习内容精选(一)
  • Marin说PCB之封装设计系列---(02)--异形焊盘的封装设计总结
  • SpringBoot使用AOP详解
  • 【Qt】QGroundControl入门1:介绍
  • 第36章_瑞萨MCU零基础入门系列教程之步进电机控制实验
  • 198.打家劫舍,213.打家劫舍II,337.打家劫舍III
  • msvcp140.dll是什么东西,如何解决msvcp140.dll丢失的问题的方法分享
  • 音视频 SDL vs2017配置
  • 前端面试要点
  • shell字符串处理之字符串比较
  • 怎么获取别人店铺的商品呢?
  • 【数据结构】二叉树的链式结构
  • 模拟实现C语言--strlen函数
  • Spring Boot + Vue的网上商城之物流系统实现
  • 释放数据价值这道难题,Smartbi V11有解
  • Day_14 > 指针进阶(3)> bubble函数
  • sql中怎么查books表下面的内容
  • Vulnhub系列靶机---HarryPotter-Aragog-1.0.2哈利波特系列靶机-1
  • .NET 8发布首个RC,比.NET 7的超级快更快
  • 在 Substance Painter中自定义Shader
  • 【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)
  • input 的 placeholder 样式
  • 4.4-Spring源码循环依赖终极讲解
  • 腾讯云4核8G服务器选CVM还是轻量比较好?价格对比
  • 数学实验-素数(Mathematica实现)
  • Vue3样式绑定
  • 【深度学习】 Python 和 NumPy 系列教程(廿二):Matplotlib详解:2、3d绘图类型(8)3D饼图(3D Pie Chart)
  • 数仓主题域和数据域、雪花模型,星型模型和星座模型