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

时间:2009-06-15 14:03:23

标签: java dependency-injection guice

也许我只是失明,但我不知道如何使用Guice(刚刚开始)来替换此方法中的new调用:

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

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

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

我如何使用Guice(2.0)实现这一目标?

3 个答案:

答案 0 :(得分:27)

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

我指向javadoc of the FactoryProvider。我相信它应该对你有用。

答案 1 :(得分:10)

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

Guice文档herehere中涵盖了它们。

提供商看起来像

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);
}

答案 2 :(得分:2)

您的处理器在整个生命周期内是否需要访问anInputValue?如果没有,可以将值传入您正在使用的方法调用,例如:

@Inject
public MyClass(Processor processor) {
    this.processor = processor;
}

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