zoukankan      html  css  js  c++  java
  • [Java] 静态代理 动态代理

    原理

    • 静态代理=代理模式
    • 动态代理=代理模式+反射
    • 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强
    • 代理类和被代理类应该共同实现一个接口,或者是共同继承某个类
    • 静态代理是事先定义好的,当需要附加的功能较多时,或代理的类较多时,代码量也会随之增大
    • 通过动态代理,代理类和被代理类在代码上实现了解耦,可在运行时动态地创建原始类对应的代理类,然后在系统中用代理类替换掉原始类,代理类和被代理类可以灵活组合,而不再增加代码量

    应用

    • Spring AOP 中,用户配置好需要给哪些类创建代理,并定义好在执行原始类的业务代码前后执行哪些附加功能,Spring为这些类创建动态代理对象,并在JVM中替代原始类对象,原本在代码中执行的原始类方法,被换做执行代理类的方法,实现了为原始类附加功能的目的
    • 业务系统的非功能性需求开发
    • RPC框架(远程代理)
    • 缓存

    同装饰器的联系与区别

    • 代理(proxy)和装饰器(decorator)都能给类增加功能
    • 区别在于,代理关注对象的信息隐藏及访问控制,体现封装性,装饰器关注为对象动态地添加功能,调整代码时更加灵活,体现多态性
    • 代理适用于业务无关,抽象度高,稳定度高的场景(如缓存);装饰器适用于偏重业务相关,定制化诉求高,改动频繁的场景
    • 使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰器能够在运行时递归地被构造
    • 代理强调对实际执行者的替代(代售点代替铁路局卖票,买票人不关心谁卖),装饰强调对自身的增强(为面包加果酱和蔬菜成为三明治,后期也可能想加点别的)
    • 二者容易混淆的原因在于,同样是A对B进行了修饰,站在A的角度,A就是代理,站在B的角度,A就是装饰器。而Java中类名是Proxy,用的多了就习惯把两种模式都称为代理
    • Java IO 使用了装饰器,用户在使用的时候,可以任意组装,达到自己想要的效果

    参考

    轻松学,Java 中的代理模式及动态代理

    https://blog.csdn.net/briblue/article/details/73928350

    装饰模式与代理模式的区别

    https://blog.csdn.net/qq_34680763/article/details/99983866

    https://zhuanlan.zhihu.com/p/97499017

  • 相关阅读:
    mongodb备份与恢复
    MongoDB-3.4安装文档
    (转)Zabbix 3.2.7编译安装记录
    (转)error while loading shared libraries:libmysqlclient.so.18 错误
    (转)如何使用Journalctl查看并操作Systemd日志
    (转)基于CentOS 7安装Zabbix 3.4和Zabbix4.0
    (转)yum安装MariaDB(使用国内镜像快速安装,三分钟安装完毕)
    (转)nmon和nmon analyser的下载和使用
    (转)Db2 数据库常见堵塞问题分析和处理
    (转)我是一个线程
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12992099.html
Copyright © 2011-2022 走看看