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

Spring Boot/MVC使用动态代理时CGLIB类名混淆问题咨询

关于控制器代理的困惑解答

嘿,我来帮你理清这个问题——你看到的那个“命名奇怪的代理”其实完全是正常现象,和你移除CGLIB的操作、JDK动态代理的预期行为完全匹配。

让我拆解一下背后的逻辑:

  • 当你的控制器实现了接口时,Spring会按照你预期的那样,使用JDK动态代理来生成代理类。这类代理类的命名格式就是com.sun.proxy.$ProxyXXX(XXX是一串数字),看起来“奇怪”但这是JDK动态代理的标准命名规则,是JDK底层自动生成的类,用来实现你的控制器接口并代理原实例的逻辑。
  • 而当你把接口移除后,Spring MVC默认不会为没有实现任何接口的控制器创建代理(除非你给这个控制器加了AOP切面、事务注解这类需要代理的增强逻辑),所以堆栈里自然就看不到代理类的痕迹了。

你之前的认知“为实现接口的Bean使用JDK动态代理而非CGLIB”是完全正确的,而且你移除CGLIB的操作也确实杜绝了Spring使用CGLIB的可能。你看到的那个“奇怪命名”的类,正是JDK动态代理生成的产物,并不是什么异常情况,只是它的命名风格容易让人产生误解而已。

如果想验证这一点,可以在代码里加一段简单的判断:

// 假设你的控制器实例是userController
if (userController instanceof Proxy) {
    System.out.println("这是JDK动态代理实例");
    System.out.println("代理类名称:" + userController.getClass().getName());
}

运行后你会发现,输出的类名就是你在堆栈里看到的那个“奇怪”的名字,完全符合JDK代理的特征。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:27