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

相关推荐
黒亱中旳3 小时前
Java AI 框架三国杀:Solon AI vs Spring AI vs LangChain4j 深度对比
java·人工智能·spring
网络工程小王3 小时前
[智能对话系统架构设计文档]
java·系统架构·langraph
alxraves4 小时前
医用超声远程会诊系统:会诊平台的核心架构与功能解析
java·人工智能·架构
带刺的坐椅4 小时前
用 Solon AI ReActAgent 落地智能客服工单处理
java·ai·llm·agent·solon·react-agent
我是坏垠4 小时前
Crypto、Cipher与Password:Java加密开发的三个核心概念
java·开发语言·python
white_ant5 小时前
JDK LTS 版本升级迁移注意事项大全
java·开发语言
戮漠summer6 小时前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
广州灵眸科技有限公司6 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
库克克7 小时前
【C++ 】内联函数
java·开发语言·c++
zh_xuan7 小时前
java 虚拟线程
java·开发语言·虚拟线程