为什么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
相关产品推荐
相关产品推荐

