代理工厂类ProxyFactory
- `AdvisedSupport`(代理配置信息类)
- `ProxyFactory`(代理工厂类)
- 小结
- 测试
源码见:mini-spring
在 AOP(面向切面编程)中,Spring 支持两种常见的代理机制:基于接口的 JDK 动态代理 和 基于字节码生成的 CGLIB 动态代理。而 代理工厂(ProxyFactory
)的引入,正是为了解决硬编码选择代理方式的问题,通过统一的封装,自动选择最合适的代理实现方式。
为了支持自动判断使用哪种代理方式,我们需要在代理配置信息中引入一个开关字段:
AdvisedSupport
(代理配置信息类)
// 是否强制使用 CGLIB 代理(即代理目标类本身,而不是接口)
private boolean proxyTargetClass = false;
这个字段是判断使用 JDK 还是 CGLIB 的关键标识。
ProxyFactory
(代理工厂类)
/*** 代理工厂类* * 用于根据配置生成对应的 AOP 代理对象。* 支持两种代理方式:* - JDK 动态代理(适用于目标类实现了接口)* - CGLIB 动态代理(适用于目标类未实现接口,或需要代理类本身)* * @author jixu* @date 2025/5/24*/
public class ProxyFactory {// 封装了代理配置(切点、拦截器、目标对象等)private final AdvisedSupper advisedSupper;/*** 构造方法* * @param advisedSupper 配置信息容器*/public ProxyFactory(AdvisedSupper advisedSupper) {this.advisedSupper = advisedSupper;}/*** 获取代理对象* * @return 生成的代理对象(JDK 或 CGLIB)*/public Object getProxy() {return createAopProxy().getProxy();}/*** 创建 AOP 代理对象* * 根据配置决定使用 JDK 动态代理还是 CGLIB 代理。* * @return AopProxy 实现类*/public AopProxy createAopProxy() {if (advisedSupper.isProxyTargetClass()) {// 需要代理类本身,使用 CGLIBreturn new CglibDynamicAopProxy(advisedSupper);}// 默认使用 JDK 动态代理return new JdkDynamicAopProxy(advisedSupper);}
}
小结
-
ProxyFactory
封装了代理选择逻辑,避免手动new
代理方式。 -
AdvisedSupper
是代理配置的核心容器。 -
proxyTargetClass = true
⇒ 使用 CGLIB(代理目标类本身) -
否则 ⇒ 使用 JDK 动态代理(基于接口)
测试
@Test
public void testProxyFactory(){ advisedSupper.setProxyTargetClass(true); ProxyFactory proxyFactory = new ProxyFactory(advisedSupper); WorldService worldService = (WorldService) proxyFactory.getProxy(); worldService.sayHello(); }