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

使用Lombok Builder注入构造器依赖:Builder是否自动处理Guice注入?

问题解答:Lombok 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:52:34