如何使用Google Guice创建需要参数的对象?

2022-09-02 03:14:18

也许我只是瞎了眼,但我不明白如何使用Guice(只是从它开始)来替换此方法中的调用:new

public boolean myMethod(String anInputValue) {
    Processor proc = new ProcessorImpl(anInputValue);
    return proc.isEnabled();
}

对于测试,处理器可能有不同的实现,所以我想避免调用,并在此过程中摆脱对实现的依赖性。new

如果我的类只能记住 Processor 的一个实例,我可以通过构造函数注入它,但是由于 Processor 被设计为不可变的,我每次都需要一个新的实例。

我该如何通过Guice(2.0)实现这一目标?


答案 1

自从我现在使用Guice以来已经有一段时间了,但我记得一种叫做“辅助注射”的东西。它允许您定义一个工厂方法,其中提供一些参数并注入一些参数。不是注入处理器,而是注入处理器工厂,它具有采用参数的工厂方法。anInputValue

我向你指出FactoryProvider的javadoc。我相信它应该对你有用。


答案 2

您可以通过注入“提供程序”来获得所需的效果,该提供程序可以在运行时要求您提供处理器。提供程序提供了一种将对象的构造推迟到请求之前的方法。

它们在这里这里的Guice文档中都有介绍。

提供程序将如下所示

public class ProcessorProvider implements Provider<Processor> {
    public Processor get() {
        // construct and return a Processor
    }
}

由于提供程序是由 Guice 构造和注入的,因此它们本身可以注入位。

您的代码将如下所示

@Inject
public MyClass(ProcessorProvider processorProvider) {
    this.processorProvider = processorProvider;
}

public boolean myMethod(String anInputValue) {
    return processorProvider.get().isEnabled(anInputValue);
}

推荐