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

为什么Spring注入的部分依赖是CGLIB代理且属性值为null?

Spring CGLIB代理相关问题解答

注解是否为CGLIB代理的触发原因

该结论成立,符合Spring AOP的默认实现逻辑:

  • Spring中@Transactional、@Async、@Scheduled这类声明式功能都基于AOP切面实现增强逻辑
  • 当被增强的目标类没有实现自定义接口时,Spring会默认选择CGLIB动态代理方案,生成目标类的子类(类名带有EnhancedBySpringCGLIB后缀)作为代理Bean注入到依赖位置

代理Bean属性全部为null的原因

这是CGLIB代理的正常运行机制,不属于异常问题:

  • CGLIB生成的代理类实例本身不会复制原始目标对象的属性值,它仅在内部持有原始目标对象的引用,所有公开方法调用都会通过代理拦截器转发到原始目标对象执行
  • 启动阶段断点看到属性正常填充的是原始目标对象实例,而注入到Service中的是外层代理实例,直接查看代理实例的属性自然为空值
  • 只要调用代理对象的公开方法时功能正常、方法内部可以正常读取到属性值,就无需额外处理

如果你确实需要直接访问原始对象的属性,可以调用org.springframework.aop.support.AopUtils.getTargetObject(代理Bean)获取到原始目标实例,再读取对应属性即可。
你确认ApplicationContext中仅存在一个对应Bean实例属于正常情况:Spring对外暴露的Bean就是代理实例,原始目标对象不会被注册到容器中,只会被代理实例内部持有。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:36:08