Spring代理类为何依赖注入失效?

有一个类 B ,里面依赖注入了 C

java 复制代码
class B {
    @Autowired C c;
}

Spring 会创建 B 的 Bean

  • 这个 Bean 是完整的
  • 已经完成了依赖注入
  • 里面的 c 是有值的
  • 它是一个真正能正常工作的对象
  • 现在要对 B 做 AOP,用 CGLIB 生成代理类 A
java 复制代码
class A extends B {
    // 代理类
}
  • 重点来了:A 继承的是 B 这个类,不是继承 B 那个已经注入好的 Bean!

    • 代理对象 A 自己是另外 new 出来的一个对象
    • Spring 不会再给 A 做一遍依赖注入
    • 所以 A 里面继承过来的 c 字段 是 null
  • 这就是为什么:在代理类 A 里面直接用 this.csuper.c 都会空。因为代理对象自己根本没被注入

  • 所以 Spring 必须这么做:

    • 先拿到那个完整、注入好的 B 的 Bean(叫 target)
    • 让代理 A 持有这个 target 对象
    • 代理不自己执行方法
    • 真正调用时,用 target.method() 去执行
  • 最终效果:

    • target 是完整 Bean,依赖都在
    • 调用它的方法,c 有值,不会空指针
    • 代理只负责增强(事务、日志等),不负责执行业务

最精简一句话总结

B 类的 Bean 是完整的、注入好的; 代理 A 只是继承了 B 类,自己没被注入,所以字段为空; 所以必须拿着原来那个 B 的 Bean 去调用方法,才能正常运行

相关推荐
自珍JAVA3 小时前
访问者模式:让你的代码优雅地“拜访”对象结构
后端
奋斗的小乌龟4 小时前
动态创建Agent02
java
ZFSS4 小时前
Localization Translate API 集成与使用指南
java·服务器·数据库·人工智能·mysql·ai编程
摇滚侠4 小时前
Java 零基础全套教程,集合框架,笔记 153-163
java·开发语言·笔记
nannan12324 小时前
后端技术栈梳理
java
L、2185 小时前
CANN算子开发调试实战:从“Segmentation Fault“到定位根因的完整流程
java·开发语言
毅航5 小时前
AI 浪潮下,会用工具不等于具备能力
后端·程序员·ai编程
索木木6 小时前
NCCL SHARP 和 TREE算法
java·服务器·算法
比特森林探险记6 小时前
go 语言中的context 解读和用法
开发语言·后端·golang
NiceCloud喜云6 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书