【23种设计模式之】8.代理模式:静态代理、jdk动态代理、cglib动态代理——概述

本文详细介绍了代理模式中的静态代理与动态代理,并对比了JDK动态代理和CGLIB动态代理的区别及适用场景。通过实例代码展示了如何实现静态代理,并解释了动态代理的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习源码:https://github.com/liaoooyx/Design-Patterns

代理模式中的静态代理装饰器模式、适配器模式中的对象适配器类似,都是使用了组合的方式。

区别在于,代理模式主要是起到增强方法和权限拦截的作用。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务,然后在业务功能执行的前后加入一些公共的服务。

静态代理
参考:设计模式—代理模式23种设计模式全解析

public class SourceProxy implements Sourceable {  
  
    private Source source;  //委托类,同样实现了Sourceable接口
    
    public SourceProxy(){  
        super();  
        this.source = new Source();  
    }  
    @Override  
    public void method() {  
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}  

JDK动态代理

关于实现:设计模式之—代理模式(AOP的原理)设计模式—代理模式
关于动态代理:java的动态代理机制详解深入理解JDK动态代理机制

简单来说,就是用实现了InvocationHandler的实现类,代替了上述静态代理中的SourceProxy类。然后通过Java提供的反射技术:Proxy.newProxyInstance()创建对象,上转型为接口的类型,然后通过接口引用,调用方法。

Interface interface = (Interface) Proxy.newProxyInstance(handler.getClass().getClassLoader(), 
										concreteClass.getClass().getInterfaces(), 
										handler);
interface.method();

cglib动态代理
参考:深入理解CGLIB动态代理机制

动态代理要求被代理的类必须实现接口。而CGLIB动态代理则没有此类强制性要求。

CGLIB创建的动态代理对象比JDK创建的动态代理对象的性能更高,但是CGLIB创建代理对象时所花费的时间却比JDK多得多。所以对于单例的对象,因为无需频繁创建对象,用CGLIB合适,反之使用JDK方式要更为合适一些。同时由于CGLib由于是采用动态创建子类的方法,对于final修饰的方法无法进行代理。(设计模式—代理模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值