Software Engineer · 语言与工程基础

Spring 依赖注入与 Bean 生命周期:构造、初始化和销毁

解释 @Autowired、构造注入、Bean 创建顺序与代理影响,区分 scope。

题目重点:解释 @Autowired、构造注入、Bean 创建顺序与代理影响,区分 scope。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 把描述中的注入注解按 @Autowired 技术主题整理;未指定应用具体 scope、代理或循环依赖设置。

解题路线

  1. IoC 容器解析定义、创建实例并注入依赖,再运行相关初始化与后处理。构造注入把必需依赖表达为构造合同,使对象少出现半初始化状态。
  2. 多候选时需要明确 qualifier/primary 等选择规则。单构造器的现代 Spring 注入不一定要显式 @Autowired,版本和配置应说明。
  3. 初始化回调发生在依赖可用后;BeanPostProcessor 可能包装代理,因此最终暴露对象不一定是原始实例引用。不要在初始化里假定所有跨 Bean 代理调用都已准备好。
  4. singleton 表示容器内共享实例,不表示线程安全。容器管理的 singleton 可有销毁回调;prototype 的完整销毁生命周期不由容器自动承担。

手动走一遍

OrderService 构造接收 PaymentGateway,有两实现时显式选择,而不是依赖碰巧扫描到的顺序。在 singleton 内放请求专属可变字段会串请求;改为局部状态或合适 scope,不能只加注解了事。

规模与取舍

启动时间取决于 Bean 数量、依赖图与初始化 I/O;共享实例降低创建量但要求并发安全,scope 选择改变资源数量。

易错点与追问

容易失分的边界

  • singleton 自动线程安全。
  • 把注入与对象生命周期只说成字段反射赋值。
  • 忽略代理与 self-invocation 边界。

继续深挖

  • 如何拆解构造器循环依赖?
  • 需要哪些证据排查启动很慢的 Bean?

技术参考

✓已复制微信号!