Spring5(16) —— 动态代理模式


  • 动态代理和静态代理中涉及的角色一样
    • 抽象业务
    • 真实业务
    • 代理角色
    • 真实角色
  • 动态代理的代理类是动态生成的,不是我们手动new出来的
  • 动态代理分为两大类
    • 基于接口的动态代理:JDK的动态代理【我们使用的方式】
    • 基于类的动态代理:cglib
    • Java字节码实现:javassist
  • 需要了解两个Java类
    • Proxy:代理类
    • InvocationHandler:invoke调用,Handler处理,即调用处理

1.InvocationHandler

在这里插入图片描述


2.Proxy

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3.案例

在这里插入图片描述
在这里插入图片描述
    从真实角色的执行结果来看,显然它调用的是代理类实现的功能,但是我们可以反观代码,在客户端中我们并没有new一个代理类,我们只是new了一个真实业务对象,然后将这个对象作为参数传入了InvocationHandler的实现类中,然后调用了InvocationHandler实现类的getProxy()就获取到了代理类实例
    而调用代理类的实例的方法则是通过InvocationHandler实现类的invoke()方法实现的,只要你调用的是抽象业务中的方法,就会转而执行invoke()方法,这一切都是通过反射实现的


4.意义

  • Proxy:用于生成动态代理对象的
  • InvocationHandler:调用Proxy返回的动态代理对象的方法,并返回结果

动态代理的好处/意义

  • 静态代理的所有好处

  • 一个动态代理代理的是一个接口,一般就是对应的一类业务

  • 动态代理类的精髓还是在于提高了代码复用

    • 体现在如果一个抽象业务接口有很多个实现类,按照静态代理的做法,一个真实业务实现类就应该对应一个代理类,那么10w个实现类就对应10w个代理类,这样显然是大大增加了代码量和降低了开发效率
    • 动态代理的好处就在于,你一个抽象业务接口有10w个真实业务实现类没关系,多个抽象业务接口对应几百万个实现类也没关系,我只写一个动态代理类对象,你在客户端想要调用抽象业务方法实现功能的时候
      • 调用setTarget()传入一个抽象业务接口的一个具体的真实业务实现类,用于获取到抽象业务接口信息
      • 调用getProxy(),将按照Proxy类的Proxy.newProxyInstance()为我们创建这个抽象业务接口对应的代理类(所以说代理的是一个接口),我们在获取返回的代理类的时候直接强转该代理类为某一个真实业务实现子类的对象,即可获取到我们想使用的真实业务实现类的代理类
      • 最后按照抽象接口中方法直接调用方法即可
      • 从上面的步骤我们就可以看出,真实业务的代理类根本就不需要我们再去编写一个类具体实现,动态代理类会为我们动态的生成

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值