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

Dan*_*ler 21 java dependency-injection guice

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

public boolean myMethod(String anInputValue) {
    Processor proc = new ProcessorImpl(anInputValue);
    return proc.isEnabled();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

wax*_*ing 27

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

我指向FactoryProviderjavadoc.我相信它应该对你有用.

  • 是的,AssistedInject是最好的解决方案.http://code.google.com/p/google-guice/wiki/AssistedInject (7认同)

Dav*_*ith 10

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

他们在这里这里的Guice Docs中都有涉及.

提供商看起来像

public class ProcessorProvider implements Provider<Processor> {
    public Processor get() {
        // construct and return a Processor
    }
}
Run Code Online (Sandbox Code Playgroud)

由于提供者是由Guice构建和注入的,因此他们自己可以注入比特.

你的代码看起来像

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

public boolean myMethod(String anInputValue) {
    return processorProvider.get().isEnabled(anInputValue);
}
Run Code Online (Sandbox Code Playgroud)