手绘6张图彻底搞懂动态代理

本文详细介绍了代理模式,从静态代理的实现及其缺点出发,探讨了对象的创建流程。接着,文章阐述了动态代理的概念,包括JDK动态代理的实现原理和使用方法,以及CGLIB动态代理的工作方式。最后,对比了JDK与CGLIB的优劣,并指出动态代理在各种框架和场景中的应用。
摘要由CSDN通过智能技术生成

在讲解动态代理前我们先聊聊什么是静态代理。

静态代理

假设有一天领导突发奇想,给你下发了一个需求:

统计项目中所有类的方法执行耗时。

在拿到需求的那一刻,脑海中冒出来的第一个想法是:

在每个方法的第一行和最后一行加上时间埋点,再打印一行日志不就完事了。

抄起键盘准备开干,想了想又开始犹豫了:

在每个方法都加几行代码,这不是侵入式修改吗?

听架构师大佬说这样的场景可以用代理模式,那尝试一下,具体做法如下。

静态代理的实现

(1)为工程里每个类都写一个代理类,让它与目标类实现同一个接口。图中标红色的就是代理类。

(2)在代理类里面维护一个目标实现类,调用代理类的方法时还是会去调用目标类的方法,只不过在前后加了一些其他逻辑代码。也就是说后面客户端不需要直接调用目标实现类,只需要调用代理类即可,这样就间接调用了对应方法。

用一个公式总结一下:代理类 = 增强代码 + 目标实现类 。

下面这个图中,计算耗时的逻辑就是增强代码。

(3)在所有 new 目标类的地方都替换为 new 代理类,并将目标类作为构造方法参数传入;所有使用目标类调用的地方全部都替换为代理类调用。

如果你看懂了上面的实现方法,那么恭喜你已经掌握了静态代理的核心思想。

静态代理的缺点

静态代理的思路非常简单,就是给每一个目标实现类写一个对应的代理实现类,但是如果一个项目有几千甚至有几万个类,这个工作量可想而知。

前面我们还隐藏了一个假设:每个类都会实现一个接口。那如果一个类没有实现任何接口,代理类如何实现呢?

好了,我们来总结一下静态代理的缺点:

  • 静态代理需要针对每个目标实现类写一个对应的代理类,如果目标类的方法有变动,代理类也要跟着动,维护成本非常高。

  • 静态代理必须依赖接口。

既然知道了静态代理的缺点,那有没有办法实现少些或者不写代理类来实现代理功能呢?答案是有,动态代理。

对象的创建流程</

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值