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
相关产品推荐
相关产品推荐

