• 代理模式


    在代码中,我们想到代理,就会理解为是代码 增强,其实就是在原本逻辑前后增加一些逻辑,而调用者无感知。
    代理模式属于结构型 模式,有静态代理和动态代理。

    public interface IDBQuery {
        String request();
    }
    
    public class DBQuery implements IDBQuery {
        public DBQuery() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        @Override
        public String request() {
            return "request string";
        }
    }
    
    /**
     * 代理模式用于实现延时加载,有效提升系统的启动速度
     */
    public class DBQueryProxy implements IDBQuery {
        private DBQuery query = null;
        @Override
        public String request() {
            if (query==null){
                query = new DBQuery();
            }
            return query.request();
        }
    
        public static void main(String[] args){
            IDBQuery proxy = new DBQueryProxy();
            String request = proxy.request();//使用时才创建真实对象
            System.out.println(request);
        }
    }
    

    代理模式在 Spring 源码中的应用

    看一下 ProxyFactoryBean 核心的方法就是 getObject()方法,看一下源码:

    • 在 getObject()方法中,主要调用 getSingletonInstance()和 newPrototypeInstance(); 在 Spring 的配置中,如果不做任何设置,那么 Spring 代理生成的 Bean 都是单例对象。 如果修改 scope 则每次创建一个新的原型对象
    • Spring 利用动态代理实现 AOP 有两个非常重要的类,一个是 JdkDynamicAopProxy 类 和 CglibAopProxy 类,来看一下类图:

    Spring 中的代理选择原则

    1. 当 Bean 有实现接口时,Spring 就会用 JDK 的动态代理
    2. 当 Bean 没有实现接口时,Spring 选择 CGLib。
    3. Spring 可以通过配置强制使用 CGLib
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    

    静态代理和动态的本质区别

    1. 静态代理只能通过手动完成代理操作,如果被代理类增加新的方法,代理类需要同步 新增,违背开闭原则。
    2. 动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开 闭原则。
    3. 若动态代理要对目标类的增强逻辑扩展,结合策略模式,只需要新增策略类便可完成, 无需修改代理类的代码。

    代理模式的优缺点

    • 优点:
    1. 代理模式能将代理对象与真实被调用的目标对象分离。
    2. 一定程度上降低了系统的耦合度,扩展性好。
    3. 可以起到保护目标对象的作用。
    4. 可以对目标对象的功能增强。
    • 缺点:
    1. 代理模式会造成系统设计中类的数量增加。
    2. 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
    3. 增加了系统的复杂度。
  • 相关阅读:
    Python——学习笔记
    Ubuntu开发相关环境搭建
    解决联想R720双系统Ubuntu16.04的无线网卡开启问题及信号不稳定
    Win10环境下多JDK切换以及could not find java.dll异常解决
    Java——this关键字总结
    Java——多线程编程学习/01
    Python日常Bug集
    《集体智慧编程学习笔记》——Chapter2:提供推荐
    解决Pycharm无法显示matplotlib绘图问题
    Kettle启动时报错Cannot create java virtual machine & A java exception has occurred
  • 原文地址:https://www.cnblogs.com/fly-book/p/11413022.html
Copyright © 2020-2023  润新知