文章目录

  • 导读
  • 问题
  • CGLib动态代理和JDK动态代理的区别
  • CGLib概述
  • 改造

导读

Spring-AOP基础知识

Java-JDK动态代理

Java-CGLib动态代理


问题

另一篇博文中的问题

性能监视横切逻辑代码


CGLib动态代理和JDK动态代理的区别

我们知道使用JDK创建代理时只能为接口创建代理实例。我们从Proxy的newProxyInstance方法中可以看出

    @CallerSensitivepublic static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

第二个参数interfaces就是需要代理实例实现的接口列表。

对于没有通用接口定义业务方法的类,该如何动态创建代理实例呢?
JDK动态代理技术显然无能为力了,CGLib作为一个替代者,很好地解决了这个问题


CGLib概述

CGLib采用底层的字节码技术,可以为一个类创建子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。


改造

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

首先在我们的java maven工程中 添加依赖

 <!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>${cglib.version}</version></dependency>

使用的版本为 3.2.5

package com.xgj.aop.base.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();public Object getProxy(Class clazz) {// 设置需要创建的子类的类enhancer.setSuperclass(clazz);enhancer.setCallback(this);// 通过字节码动态创建子类实例return enhancer.create();}// 拦截父类所有方法的调用@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {// 横切逻辑代码PerformanceMonitor.begin(obj.getClass().getName() + "."+ method.getName());// 业务逻辑,通过代理类调用父类中的方法Object result = proxy.invokeSuper(obj, args);// 横切逻辑代码PerformanceMonitor.end();return result;}}

上述代码,我们通过getProxy(Class clazz)方法为一个类创建动态代理对象,该代理对象通过扩展clazz实现代理。

在这个代理对象中,织入性能监视的横切逻辑。

public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) 是CGLib定义的Interceptor接口方法,它拦截所有目标类方法中的调用。

其中

  • obj表述目标类的实例

  • method为目标类方法的反射对象

  • args为方法的动态入参

  • proxy为代理类的实例

测试类

通过CglibProxy为ForumSerivceImpl类创建代理对象,并测试代理对象的方法

package com.xgj.aop.base.cglib;public class ForumServiceTest {public static void main(String[] args) {CglibProxy cglibProxy = new CglibProxy();// 通过动态生成子类的方式创建代理类ForumServiceImpl forumService = (ForumServiceImpl) cglibProxy.getProxy(ForumServiceImpl.class);// 调用代理类的业务方法forumService.removeTopic(1);forumService.removeForum(2);}
}

运行结果

通过输出,可以看到除了两个业务方法中都织入了性能监控的逻辑外,还发现代理类的名字变成了

com.xgj.aop.base.cglib.ForumServiceImpl$$EnhancerByCGLIB$$2088954a

这个特殊的类就是CGLib为ForumServiceImpl动态创建的子类。

注意:由于cglib采用动态创建子类的方式生成代理对象,所以不能对目标类中的final或者private方法进行代理

Java-CGLib动态代理相关推荐

  1. java CGLIB动态代理

    CGLIB动态代理 一:CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成.CGLIB通过继承方式实现代理. 二: ...

  2. Java Cglib 动态代理intercept的参数含义

    如何使用CGLIB创建动态代理,网上已经有很多资料,这里就不再赘述. 直接说结论. 当我们使用自定义类 private static class MethodInterceptorImpl imple ...

  3. 谁与争锋,JDK动态代理大战CGLib动态代理

    文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...

  4. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

  5. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  6. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  7. java动态代理和cglib动态代理

    本文转自: http://blog.csdn.net/leon709/article/details/9529307 动态代理应用广泛,spring,Struts等框架很多功能是通过动态代理,或者进一 ...

  8. Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

  9. java jdk动态代理 cglib动态代理demo

    最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo jdk动态代理实现: View Code import ...

  10. Java 静态代理、Java动态代理、CGLIB动态代理

    为什么80%的码农都做不了架构师?>>>    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...

最新文章

  1. socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空
  2. 深入跨域问题(2) - 利用 CORS 解决跨域
  3. go消息服务器吗,Go语言聊天服务器
  4. 向量的 加,减,乘 运算_2
  5. 域名购买以及云解析DNS
  6. c语言while函数作用,c语言while(c语言while循环用法)
  7. 努力不是为了追赶别人,只是为了超越自己
  8. python定时任务启动与停止_python定时任务最强框架APScheduler详细教程
  9. 玲珑杯”ACM比赛 Round #8-D XJT Loves Boggle(dfs)
  10. 从零开始- Android刷机指南一
  11. Annotate点云标注工具
  12. 怎么用手机记笔记?安卓手机超实用的笔记app
  13. 东北师范计算机应用基础20秋在线作业1,21秋21春20秋-计算机应用基础20春在线作业1...
  14. 网络编程-tcp/udp
  15. linux清理网卡流量,Linux实时显示网卡流量的工具nload
  16. iOS 网络权限弹框处理
  17. 携程笔试题:订单查询
  18. 扫雷游戏2023.4.3
  19. 研究生人工智能就业没烦恼?一文了解研究生AI就业前景
  20. [SWF]在线预览文档下载

热门文章

  1. 如何优雅的实现pandas DataFrame 和spark dataFrame 相互转换
  2. tensorflow 进阶 五 ---TensorFlow conv2d原理及实践
  3. 两个数组找相同元素_Excel 数组公式全面解析
  4. 深度学习核心技术精讲100篇(七十四)-教你如何最快入门用户画像
  5. matlab R2010a windows和linux版本下载地址
  6. hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法
  7. c语言 二级菜单_收下计算机二级秘笈,考场上说好不哭!
  8. Python入门100题 | 第006题
  9. 【LeetCode从零单排】No38.CountAndSay
  10. 第三周 数据分析之概要 Pandas库数据特征分析