You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除Spring Boot改用纯Spring后,@Transactional致getClass返回代理类问题

解决Spring事务代理返回JDK动态代理类而非实际类的问题

嘿,这个问题我之前从Spring Boot切换到纯Spring框架时也碰到过,核心原因是Spring事务默认的代理机制在两种环境下的配置差异,再加上你的代码结构刚好触发了JDK动态代理逻辑导致的。

为什么会出现com.sun.proxy.$Proxy73?

Spring的@Transactional注解默认采用JDK动态代理:当你的类A实现了I接口时,Spring会创建一个实现I接口的代理类(就是你看到的com.sun.proxy.$Proxy73),而不是直接返回A的实例。

在Spring Boot中,可能你之前的隐式自动配置(或者自己悄悄加过配置)开启了CGLIB代理,所以之前能拿到实际类;但切换到纯Spring后,默认的事务代理配置是JDK动态代理,就出现了这个差异。

解决方案

下面给你几个可行的解决办法,按推荐程度排序:

1. 配置Spring使用CGLIB代理

通过修改Spring事务管理配置,强制使用基于类的CGLIB代理。这样代理类会是A的子类,调用getClass()时虽然会返回CGLIB生成的子类(比如A$$EnhancerBySpringCGLIB$$xxxx),但可以通过getSuperclass()拿到实际的A类,类名也更贴近你的预期。

在Spring配置类上添加:

@Configuration
@EnableTransactionManagement(proxyTargetClass = true) // 关键参数:开启CGLIB代理
public class TransactionConfig {
    // 其他事务相关配置(比如DataSource、TransactionManager)...
}

2. 获取代理背后的真实目标对象

如果你不想修改代理模式,也可以用Spring提供的工具类直接穿透代理拿到真实实例,不管是JDK代理还是CGLIB代理都适用:

import org.springframework.aop.support.AopUtils;
import org.springframework.aop.framework.AopProxyUtils;

public class XYZ {
    @Autowired
    public void registerI(I[] array) {
        // 获取真实目标对象(适用于大多数场景)
        I realI = (I) AopUtils.getTargetObject(array[0]);
        System.out.println(realI.getClass()); // 输出 com.package.path.A
        
        // 如果是多层代理嵌套,用这个更稳妥
        Object realTarget = AopProxyUtils.getSingletonTarget(array[0]);
        if (realTarget != null) {
            System.out.println(realTarget.getClass());
        }
    }
}

注意:默认情况下Spring代理允许获取目标对象,除非有特殊的安全配置限制。

3. 不推荐:直接注入实现类(违背设计原则)

如果你一定要直接拿到A的实例,可以把注入类型改成A[]而非I[],但这种方式违背了依赖倒置原则,会让代码耦合度变高,大型项目里不建议这么做:

public class XYZ {
    @Autowired
    public void registerI(A[] array) {
        // 即使这样,还是会返回代理类,除非开启CGLIB代理并设置proxyTargetClass=true
        System.out.println(array[0].getClass().getSuperclass());
    }
}

这个方法本质还是绕不开代理问题,所以不如前两种方案靠谱。

额外说明

  • JDK动态代理更轻量,必须基于接口实现;CGLIB基于类生成子类字节码,不需要类实现接口,但会增加一点性能开销。
  • 如果你的类没有实现任何接口,Spring默认会自动用CGLIB代理,但你的A实现了I,所以触发了JDK代理的逻辑。

内容的提问来源于stack exchange,提问作者lukaszrys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:28:24