设计模式之静态代理和动态代理

本文介绍了代理模式的概念,包括静态代理和动态代理。静态代理适用于已知被代理对象的情况,而动态代理则提供了更大的灵活性,能对任意类进行增强。动态代理分为JDK动态代理和CGLib动态代理,前者需要被代理类实现接口,后者则不需要。在Spring AOP中,会根据被代理对象是否实现接口选择合适的动态代理方式。动态代理在Java中通过asm技术实现字节码生成,通过设置系统属性可以保存生成的代理类文件。

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

定义

本质是对目标方法的增强,允许代理类在执行目标方法时,做些自己的事来增强目标方法。

静态代理

如果知道被代理类的具体职责,可以使用静态代理。如果不清楚被代理类是谁,只能只用动态代理。这是静态代理和动态代理的区别,即是否清楚被代理对象是谁。

UML

代理类和被代理类同时实现Movable接口,此时,除了可以增强Tank对象外,还允许对代理对象做增强,实现代理和代理之间的互相嵌套。是不是很像装饰者模式?其实有些设计模式本身就没有清晰的边界。
在这里插入图片描述

代码

UML图已经很清晰了,写点核心代码,体会这个UML的精髓。

new Proxy(new Proxy(new Tank()));

动态代理

动态代理分JDK动态代理和CGLib动态代理,都比较简单,不再累赘。学习动态代理的时候,建议将asm生成的代理类保存到文件中,设置以下参数:

System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

总结

静态代理在知道被代理对象的时候可以用,简单。动态代理有更大的灵活性,允许对任何类做增强。

JDK动态代理和CGLib动态代理底层都是实用asm动态字节码技术,JDK动态代理中,被代理的类需要有继承的接口。CGLib动态代理不需要有任何父类或实现任何接口,简单。

Spring的AOP中,看情况选择动态代理方式:

  1. 默认使用 JDK 动态代理,这样便可以代理所有的接口类型(interface)
  2. Spring AOP也支持CGLIB的代理方式。如果我们被代理对象没有实现任何接口或者实现的接口都是空接口,则是CGLIB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值