架构师内功心法6——代理模式

一、基础

    定义:是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用。属于结构型设计模式。

    适用场景:保护目标对象;增加目标对象。

    优点:代理模式能将代理对象与真实被调用的目标对象分离;一定程度上降低了系统的耦合程度,易于扩展;代理可以起到保护目标对象的作用;增强目标对象的职责。

    缺点:会造成系统设计中类的数目增加;在客户端和目标对象之间增加了一个代理对象,请求处理速度变慢;增加了系统的复杂度。

    Spring中的代理选择原则:

        (1)、当Bean有实现接口时,Spring就会用JDK的动态代理;

        (2)、当Bean没有实现接口时,Spring选择CGLib;

        (3)、Spring可以通过配置强制使用CGLib,只需在Spring的配置文件中加入如下代码:<aop:aspectj-autoproxy proxy-target-class="true"/>。


ISubject


RealSubject
Proxy


Client
类图

二、静态代理


IPerson


ZhangSan


ZhangLaoSan


Test


三、动态代理

1、JDK


IPerson


ZhangSan


ZhaoLiu


JdkMeipo


Test


2、Cglib


Customer


CGlibMeipo



CglibTest

3、jdk动态代理与cglib动态代理的区别

    1、JDK是采用读取接口的信息,CGLib覆盖父类方法,目的都是生成一个新的类,去实现增强代码逻辑的功能 。

    2、JDK Proxy 对于用户而言,必须要有一个接口实现,目标类相对来说复杂;CGLib 可以代理任意一个普通的类,没有任何要求。

    3、CGLib 生成代理逻辑更复杂,调用效率更高,生成一个包含了所有的逻辑的FastClass,不再需要反射调用;JDK Proxy生成代理的逻辑简单,执行效率相对要低,每次都要反射动态调用。

    4、CGLib 有个坑,CGLib不能代理final的方法。

4、自己写一个动态代理


MyInvocationHandler


MyClassLoader


MyProxy(1)


MyProxy(2)


MyProxy(3)



问:总结静态代理和动态代理的跟本区别。

    答:静态代理:硬编码、手动注入,手动拿到目标对象的引用,手动调用代理目标的方法;

            动态代理:具有更强的扩展性,自动注入,自动生成一个新的类(同一个继承体系)。

            特征:拿到代理目标对象的引用,实现功能增强,保护目标对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容