代理设计模式

一,什么是代理设计模式?

代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。即通过一个中间人去调用目标类。

 

二,代理设计模式的分类

代理设计模式分成静态代理和动态代理。

静态代理,由我们自己创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

动态代理,在程序运行时通过反射去创建的代理类。

 

三,静态代理具体实现

 

四,动态代理:

通过jdk实现动态代理:

 

②通过cglib实现动态代理

 

五,他们之间的对比

1.静态代理
    静态代理,由程序员创建或特定工具自动生成源代码,在编译时已经将接口,被代理类(委托类),代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

2.动态代理:
    代理类在程序运行时常见的代理方式被称为动态代理。
    ①jdk动态代理:
    不需要实现接口,但是要求目标对象必须实现接口,否则不能使用动态代理

    ②cglib动态代理:
    可以代理没有实现接口的类。
    CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用, 例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。
    CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它需要你对JVM内部结构包括class文件的格式和指令集都很熟悉

    ③对比:
    可以看到cglib的代理方式不需要传入被代理对象实例即可完成动态代理。
    cglib和jdk代理有什么区别呢?
    jdk的代理对象与被代理对象实现了同一接口,底层通过clone()方法,将实现类的方法复制过来在按照invoke中的配置对方法进行增强。
    而cglib代理则是代理对象继承了被代理对象的方法,然后自身进行增强。这两种代理思想在外来的自动生成代码方向会经常被使用,实现完全体代码的复用性。

3.三者对比
    ①静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
    ②静态代理实现简单,但只能为一个目标对象服务。如果目标对象过多,则会产生很多代理类
    ③JDK动态代理需要目标对象实现业务接口,代理类只需实现InvocationHandler接口

    ④JDK动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
    而JDK动态代理须实现InvocationHandler接口,通过反射代理方法,比较消耗系统性能,但可以减少代理类的数量,使用更灵活。

    ⑤cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类

    ⑥cglib代理的对象无需实现接口,达到代理类无侵入

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值