Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用GoogleGuice创建需要参数的对象?_Java_Dependency Injection_Guice - Fatal编程技术网

Java 如何使用GoogleGuice创建需要参数的对象?

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调用,并在此过程中消除对实现的依赖 如果我的类能够记住处理器的一个实例,我可以通过构造函数

也许我只是瞎了眼,但我不知道如何使用Guice(从它开始)来替换此方法中的
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?无法在下载。对于其他正在查看的用户,可以在