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

使用@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:24:27