使用Lombok Builder注入构造器依赖:Builder是否自动处理Guice注入?
首先直接给结论:是的,a.getObjB() 和 a.getObjC() 都会返回 null,原因在于 Lombok 的 @Builder 生成的建造者逻辑完全独立于 Guice 的依赖注入机制,具体解释如下:
核心原因
Guice 的 @Inject 注解是用来告诉 Guice 框架如何创建并注入依赖实例的,但它只在 Guice 管理实例创建时生效——比如通过 Injector.getInstance(A.class) 获取实例,或者在其他被 Guice 托管的类中通过 @Inject 注入 A 对象。
而你直接调用 A.builder().build() 是手动触发建造者模式创建实例,这个过程完全和 Guice 无关:Lombok 生成的 build() 方法会调用你的 @Inject 构造函数,但由于你没有通过 builder 设置 objB 和 objC 的值,这两个参数会以 null 传入构造函数,最终导致实例中的这两个字段都是 null。
如何让 Builder 结合 Guice 注入?
如果你想通过建造者模式创建 A 实例,同时让 Guice 注入依赖,可以参考以下几种方案:
1. 在 Guice 托管类中注入依赖后传递给 Builder
在被 Guice 管理的类里,先注入 B 和 C 的实例,再传给 Builder:
public class Main { private final B objB; private final C objC; @Inject public Main(B objB, C objC) { this.objB = objB; this.objC = objC; } public void doSomething() { A a = A.builder() .objB(objB) .objC(objC) .build(); // 此时 objB 和 objC 都有值 } }
2. 使用 Guice 的辅助注入(Assisted Injection)
如果你的 A 类需要部分参数手动设置、部分由 Guice 注入,可以用 Guice 的 AssistedInject 扩展,让 Guice 生成支持混合注入的 Builder,兼顾手动参数和自动注入的需求。
3. 自定义 Builder 并注入依赖
你可以手动编写 Builder 类,让它依赖 Guice 注入的 B 和 C:
import com.google.inject.Inject; import lombok.Getter; @Getter public class A { private final B objB; private final C objC; @Inject public A(B b, C c) { this.objB = b; this.objC = c; } // 自定义 Builder,需要注入 B 和 C public static class Builder { private final B objB; private final C objC; @Inject public Builder(B objB, C objC) { this.objB = objB; this.objC = objC; } public A build() { return new A(objB, objC); } } }
然后在使用时,注入 A.Builder 来创建实例:
public class Main { private final A.Builder aBuilder; @Inject public Main(A.Builder aBuilder) { this.aBuilder = aBuilder; } public void doSomething() { A a = aBuilder.build(); // objB 和 objC 已由 Guice 注入 } }
内容的提问来源于stack exchange,提问作者Manav Bhanot

