使用@Lazy与@RequiredArgsConstructor的两种写法是否等价?
两种@Lazy与@RequiredArgsConstructor组合写法是否等价?
这两种写法不等价,核心差异在于@Lazy的作用对象和生效逻辑完全不同:
第一种写法的实际效果
原代码:
@RequiredArgsConstructor(onConstructor_ = {@Lazy}) class A{ private final B b; @Lazy private final C c; }
Lombok会生成如下构造方法:
@Lazy A(B b, C c) { this.b = b; this.c = c; }
这里的@Lazy标注在构造方法整体上,在Spring中的生效逻辑是:
- Bean A本身会被延迟初始化,只有当A第一次被其他Bean依赖或主动获取时,才会创建A的实例
- 参数B和C都会在A初始化时被即时注入,字段C上的
@Lazy默认不会被Lombok传递到构造参数上,因此C不会被延迟注入
第二种写法的实际效果
原代码:
class A{ private final B b; private final C c; A(B b,@Lazy C c){ this.b = b; this.c = c; } }
这里的@Lazy标注在构造参数C上,在Spring中的生效逻辑是:
- Bean A会正常即时初始化(除非A类本身被@Lazy标注)
- 参数B会被即时注入,而参数C会被注入一个代理对象,只有当第一次调用C的方法时,才会真正初始化C的实例
如果想要让第一种写法等价于第二种写法,需要调整为显式给参数C添加@Lazy:
class A{ private final B b; private final C c; @RequiredArgsConstructor A(B b, @Lazy C c) {} }
内容的提问来源于stack exchange,提问作者Crazy Coke
相关产品推荐
相关产品推荐

