You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring @Lazy注解弊端疑问:已使用非懒单例Bean时该弊端是否仍存在

关于@Lazy解决循环依赖时弊端的疑问

问题描述

我打算用@Lazy注解解决Spring中的循环依赖问题,但了解到它有个弊端:如果Bean配置出错,相关错误只会在调用该Bean的时候才会暴露。Spring官方文档提到:

请注意,此类延迟解析代理始终会被注入;如果目标依赖项不存在,您只能通过调用时的异常发现这一点。因此,此类注入点会导致可选依赖项的行为不符合直觉。

我的疑问是:如果我已经在应用的其他地方把这个Bean作为非懒加载单例使用了(这基本能证明该Bean可以成功创建),那上面说的这个弊端还真的算是问题吗?

示例代码

@Component
class A {
  @Autowired
  private B b;
}

@Component
class B {
  @Autowired
  @Lazy
  private A a;
}

@Component
class C {
  @Autowired
  private A a; // 这里证明Bean A能被成功创建,调用B时注入A不会失败
}

解答

结论:这种场景下,@Lazy的该弊端基本可以忽略

原因如下:

  • 非懒加载的单例Bean会在Spring容器启动阶段完成初始化。就像示例中的C直接注入了A,这意味着Spring启动时就会创建A的实例,同时处理A依赖的B,整个流程如果存在配置错误(比如A的依赖缺失、初始化逻辑抛出异常等),会直接在容器启动时报错,根本不会等到后续调用阶段才暴露问题。
  • B中通过@Lazy注入的A本质是一个代理对象,最终指向的是容器启动时已经成功创建的A单例实例。既然容器启动时A已经完成初始化,后续调用B中的A时,就不可能出现“目标依赖项不存在”的情况,自然不会触发那个“调用时才暴露错误”的问题。

唯一需要注意的例外:如果A的初始化逻辑包含延迟触发的错误(比如某些字段未在初始化时赋值,仅在第一次调用特定方法时才抛出异常),这类错误仍会在调用时暴露,但这属于A自身的代码问题——即便不用@Lazy,调用该方法时同样会报错,和@Lazy的弊端无关。

内容的提问来源于stack exchange,提问作者beatrice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:01:35