代理/Proxy

LXang723

《Java 设计模式及实践》 P66 4.2 代理模式

每当使用 Enterprise 或 Spring bean ,模拟实例和实现 AOP 时,对具有相同接口的另一个对象进行 RMI 或 JNI 调用,或直接/间接使用 java.lang.reflect.Proxy 时,就会涉及一个代理对象。它的目的是为真实对象提供一个代理对象,二者占用的内存一样。在调用前后执行其他操作时,由代理对象代理原对象的工作。

代理对象的作用,简而言之,就是在不改变原有业务逻辑的情况下,在方法执行前后插入一些操作,通常是为了日志记录、事务管理、安全控制等。

在 Spring 或 Enterprise JavaBean(EJB)中,代理对象通常通过动态代理实现。具体的实现方式可以是:

    1. JDK 动态代理:如果目标对象实现了接口,Spring 会通过 java.lang.reflect.Proxy 创建代理类。
    1. CGLIB 代理:如果目标对象没有实现接口,Spring 会通过 CGLIB 库(基于字节码操作)生成目标对象的子类,来实现方法的代理。

代理对象和原对象的内存占用一样,主要是因为代理对象内部持有真实对象的引用,这样它能够通过调用真实对象的方法来完成实际的业务逻辑。

RMI 或 JNI 调用,代理对象也能被用来在分布式系统中充当客户端与服务器之间的通信桥梁。在这种情况下,代理对象通常会用来隐藏网络通信的复杂性,提供一个本地的接口,客户端调用时看不出远程调用的细节。

总结一下,代理对象的核心目的就是通过透明地引入额外的操作,来增强或修改目标对象的行为,同时保持原有逻辑的完整性。

问题

在理想情况下,我们希望将代码直接放入对象的类中,但这并非总是能实现:比如类可能是第三方封闭库的一部分。

应用场景

参考

REFACTORING·GURU· 代理模式open in new window

最后更新时间 2/14/2025, 5:53:56 AM