您的位置:首页 > 其它

静态代理和动态代理的区别,使用场景是什么

2020-01-14 00:55 603 查看

代理模式

(1)什么是代理?
代理是一种常用的设计模式,主要作用是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以再客户端和目标对象之间起到中介的作用.
(2)什么时候使用代理?

  • 设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的diamante,里面代码逻辑让人摸不到头脑,这是就会很难去修改代码,那么这是我们可以通过代理对类进行增强.
  • 我们在使用RPC框架的时候,框架本身并不能提前知道哥哥业务方要调用哪些接口的哪些方法.那么这个时候,就可通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架解耦合的一种表现
  • spring的AOP机制就是采用动态的机制来实现切面编程.


(3)代理模式的好处:
① 职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰
② 代理对象可以再客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用.
③ 高扩展性
  为了解决我们对功能方法进行扩展,不直接去修改源码的问题,引入了代理

1.静态代理

静态代理:由程序员创建代理类或者特定的工具自动生成源代码在对其进行编译
静态代理----真是方法和代理方法的名字和参数等相同,方法体不同即可,真实对象和代理对象实现相同的接口

优点:
解耦合,简单
缺点:
代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法,代码重复,如果接口增加一个方法,除了所有实现类需要实现这个方法之外,还需要所有的代理类也实现这个方法,增加了代码的复杂度.

2.动态代理

动态代理:在程序运行时用反射机制,动态创建

1.JDK动态代理 — 接口级别代理

步骤:
① 获取真实对象上的所有接口列表
② 确定要生成的代理
③ 根据需要实现的接口信息,在代码中动态生成该代理类的字节码
④ 将对应的字节码转换成对应的class对象
⑤ 创建InvocationHandler实例Handler.用来处理代理所有方法调用
⑥ 代理的class对象已创建的Handler对象为参数,实例化一个代理对象
特点:真实对象和代理对象实现相同的接口
效率:JDK动态代理是基于反射的,效率比较低
好处:它是官方自带的,在使用是无需自己再导入jar包

2.CGLIB代理 — 方法级别代理

步骤:
① 查找A上的所有非final的public类型的方法定义
② 将这些方法的定义转换成字节码
③ 将组成的字节码转换成相对应的代理的class对象
④ 实现MethodInterceptor接口,用来处理对代理类上所有方法的请求
特点:基于继承,代理对象继承真实的对象
效率:基于字节码文件动态生成,效率高
坏处:第三方提供,需要导入jar包

  • 点赞
  • 收藏
  • 分享
  • 文章举报
帝都的竹签 发布了32 篇原创文章 · 获赞 2 · 访问量 372 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐