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.c、super.c 都会空。因为代理对象自己根本没被注入。

  • 所以 Spring 必须这么做:

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

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

最精简一句话总结

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

相关推荐
小码哥_常1 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw5 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号6 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨6 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠6 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David7 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel7 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放7 小时前
Python基础语法练习题(73)
java·前端·python