Java 如何使用GoogleGuice创建需要参数的对象?
也许我只是瞎了眼,但我不知道如何使用Guice(从它开始)来替换此方法中的Java 如何使用GoogleGuice创建需要参数的对象?,java,dependency-injection,guice,Java,Dependency Injection,Guice,也许我只是瞎了眼,但我不知道如何使用Guice(从它开始)来替换此方法中的new调用: public boolean myMethod(String anInputValue) { Processor proc = new ProcessorImpl(anInputValue); return proc.isEnabled(); } 对于测试,可能会有不同的处理器实现,因此我希望避免new调用,并在此过程中消除对实现的依赖 如果我的类能够记住处理器的一个实例,我可以通过构造函数
new
调用:
public boolean myMethod(String anInputValue) {
Processor proc = new ProcessorImpl(anInputValue);
return proc.isEnabled();
}
对于测试,可能会有不同的处理器实现,因此我希望避免new
调用,并在此过程中消除对实现的依赖
如果我的类能够记住处理器的一个实例,我可以通过构造函数注入它,但是由于处理器被设计为不可变的,所以每次我都需要一个新的
我如何使用Guice(2.0)实现这一目标?我现在已经有一段时间没有使用Guice了,但我记得有一个叫做“辅助注射”的东西。它允许您定义一个工厂方法,其中提供一些参数,并注入一些参数。不是注入处理器,而是注入一个处理器工厂,它有一个工厂方法,接受
anInputValue
参数
我指给你看。我相信它应该对您有用。您的处理器是否需要在其整个生命周期中访问输入值?如果不是,是否可以为正在使用的方法调用传入值,例如:
@Inject
public MyClass(Processor processor) {
this.processor = processor;
}
public boolean myMethod(String anInputValue) {
return processor.isEnabled(anInputValue);
}
您可以通过注入一个“提供者”来获得想要的效果,在运行时可以要求它为您提供一个处理器。提供程序提供了一种延迟对象构造直到请求的方法 它们在Guice文档和 提供者看起来像
public class ProcessorProvider implements Provider<Processor> {
public Processor get() {
// construct and return a Processor
}
}
@Inject
public MyClass(ProcessorProvider processorProvider) {
this.processorProvider = processorProvider;
}
public boolean myMethod(String anInputValue) {
return processorProvider.get().isEnabled(anInputValue);
}
处理器的实现被设计成是不可变的,用他们需要的所有数据创建它们一次,然后只向它们索取东西。非常感谢,这似乎就是我想要的。有时你看不到所有树的林。你可能想从调试模块绑定一个DebugProcessorProvider,但是如果你一直在使用Guice,你可能已经知道了。既然API现在改为Process.isEnabled(一个输入值)(与我的回答相同),为什么现在还要包括一个提供程序呢?为什么不只使用一个处理器而完全跳过提供程序呢?维格斯先生:很抱歉我的第一个评论。你当然是对的。在本例中,我没有认识到的是,提供程序也没有任何参数@援助是一条道路,尽管这个例子在这方面并不正确。我现在注入一个ProcessorFactory。相应地更改了接受的答案。更正了示例中的错误。并同意@Assisted是一条路。是的,AssistedInject是最好的解决方案。这是我写的一篇关于它的短文。辅助注射是解决一些问题的一个很好的工具,我相信它并不是那么广为人知。传播知识做得好。我在哪里可以买到辅助注射用的.jar?无法在下载。对于其他正在查看的用户,可以在