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

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

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

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

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

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

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

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

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

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

提供商看起来像

 public class ProcessorProvider implements Provider { 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); } 

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

 @Inject public MyClass(Processor processor) { this.processor = processor; } public boolean myMethod(String anInputValue) { return processor.isEnabled(anInputValue); }