从多处拷贝粘贴而来,原文无处可考了,感谢几位原创者的付出

JDK动态代理和Cglib动态代理

写了个小demo,GitHub:https://github.com/ConanDennis/dynamicProxyDemo

JDK静态代理:

jdk静态代理实现比较简单,一般是直接代理对象直接包装了被代理对象

JDK动态代理:

1.能够继承静态代理的全部优点.并且能够实现代码的复用.
2.动态代理可以处理一类业务.只要满足条件 都可以通过代理对象进行处理.
3.动态代理的灵活性不强.
4.JDK 的动态代理要求代理者必须实现接口, , 否则不能生成代理对象. .

Cglib动态代理:

1.不管有无接口都可以创建代理对象.
2.cglib创建的代理对象是目标对象的子类.

注意:要在pom中引入cglib依赖

<dependency> 
  <groupId>cglib</groupId> 
  <artifactId>cglib</artifactId> 
  <version>2.2.2</version> 
</dependency> 

使用spring的AOP代理对象生成策略:

1.在spring中默认条件下如果目标对象有接口,则使用JDK的动态代理.
 如果目标对象没有接口则默认使用cgLib动态代理.

2.当从容器中获取对象时,如果获取的对象满足切入点表达式.那么就会为其创
建代理对象.代理对象指定方法就会执行与切入点绑定的通知方法.

优缺点

jdk静态代理类只能为一个被代理类服务,如果需要代理的类比较多,那么会产生过多的代理类。jdk静态代理在编译时产生class文件,运行时无需产生,可直接使用,效率好。

jdk动态代理必须实现接口,通过反射来动态代理方法,消耗系统性能。但是无需产生过多的代理类,避免了重复代码的产生,系统更加灵活。

cglib动态代理无需实现接口,通过生成子类字节码来实现,比反射快一点,没有性能问题。但是由于cglib会继承被代理类,需要重写被代理方法,所以被代理类不能是final类,被代理方法不能是final。

因此,cglib的应用更加广泛一点。

AOP的两种动态代理机制相关推荐

  1. Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)

    代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...

  2. 【Spring】Spring中AOP解析 上 两种动态代理方式与ProxyFactory代理工厂

    1.两种动态代理方式演示 1.1 JDK动态代理 JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程.要求被代理类必须实现一个接口 . 如下案 ...

  3. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  4. AOP 拦截器 JDK动态代理机制 struts2 mybatis spring-aop

    struts2拦截器兑现原理(转) struts2拦截器实现原理(转) 第一步:创建目标对象的接口 /** * 目标对象的接口 JDK的动态代理要求目标对象必须实现一个接口 *  * @author ...

  5. spring aop 会根据实际情况(有无接口)自动选择 两种 动态代理(jdk和cglib)之一...

    资料: (1)Cglib的简单使用: https://blog.csdn.net/zhanghongjie0302/article/details/45648947 (2)关于java字节码框架ASM ...

  6. Java中三种代理方式—— 静态代理与两种动态代理的实现机制

    个人博客请访问 http://www.x0100.top 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现 ...

  7. Spring的两种动态代理:Jdk和Cglib 的区别和实现

    这是有意义的一天!自己研究一路畅通的感觉真爽 原理是参考大神的,代码手敲 一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处 ...

  8. spring的aop的动态代理机制都有哪些_Spring学习(4):Spring AOP

    Spring AOP说明 AOP(Aspect Oriented Pragraming)面向切面编程,AOP采用横向抽取机制,取代了传统纵向继承体系的重复性代码(性能监视.事务管理.安全检查.缓存). ...

  9. unity 3D里有两种动态加载机制

    unity 3D里有两种动态加载机制: 一是Resources.Load: 一是通过AssetBundle: 其实两者本质上没有什么区别.Resources.Load就是从一个缺省打进程序包里的Ass ...

最新文章

  1. 【linux】Valgrind工具集详解(十):SGCheck(检查栈和全局数组溢出)
  2. Hadoop平台作业参数设置关于mapreduce.job.split.metainfo.maxsize的说明
  3. mysql利用tgz恢复_Mysql备份与恢复方法_MySQL
  4. 【人生杂谈】生命DNA/理性思维/天才神经病
  5. TensorFlow基础笔记(13) tf.name_scope tf.variable_scope学习
  6. Python编码详解
  7. 深度学习 --- 优化入门一(梯度下降所面临的问题)
  8. document.body.scrollTop值为0的解决方法[转]
  9. poatman32位下载_Postman.dll下载|Postman.dll下载官方版【32位|64位】-太平洋下载中心...
  10. 在linux 或docker中使用 system.drawing.common
  11. (转) windows 下ORA-12514:TNS 监听问题
  12. macOS中显示按键操作
  13. JAVA通过BufferedImage进行图片的绘制,缩放,裁剪,水印等操作
  14. uni-app 使用蓝牙打印机ESC/POS指令基础方法
  15. 计算机专业电脑内存,电脑内存大小是否和速度有关?
  16. 两个冲击函数相乘的傅里叶变换_通信第三章常见函数的傅里叶变换.ppt
  17. 清算中的二清是什么东东
  18. 基于红外遥控的arduino遥控小车
  19. 如何快速的删除空间黑历史说说
  20. matplotlib从绘图到排版

热门文章

  1. OpenJudge NOI 2.1 7621:硬币面值组合
  2. win10 如何查看redis版本
  3. linux批量修改文件时间
  4. 基于进程的资源监控系列(三)--nethogs
  5. linux项目部署、Nginx详解
  6. 回归分析中的相关度(Corr)和R^2
  7. 为什么说SQL语句中使用IN性能不高?
  8. C# Find() 与 FindAll()方法的使用
  9. 3D激光雷达SLAM算法学习02——3D激光雷达传感器
  10. 文件服务器迁移方法,文件服务器迁移工具