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 去调用方法,才能正常运行

相关推荐
葫芦和十三4 小时前
图解 MongoDB 05|文档模型设计:内嵌 vs 引用,反范式不是免费午餐
后端·mongodb·agent
不能放弃治疗8 小时前
单 Agent 实现模式
后端
IT_陈寒10 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
小bo波10 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
fliter10 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
fliter11 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪11 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter11 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶12 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
JensCS猿12 小时前
从 Spring Boot 回看 SSM 框架:手动挡与自动挡的驾驶哲学
后端