【问题标题】:How to use Google Guice to create objects that require parameters?如何使用 Google Guice 创建需要参数的对象?
【发布时间】:2009-06-15 14:03:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    你可以通过注入一个“Provider”来获得你想要的效果,它可以在运行时被要求给你一个处理器。提供者提供了一种将对象的构造推迟到请求之前的方法。

    Guice Docs herehere 对它们进行了介绍。

    提供者看起来像

    public class ProcessorProvider implements Provider<Processor> {
        public Processor get() {
            // construct and return a Processor
        }
    }
    

    由于 Providers 是由 Guice 构造和注入的,它们自己可以注入比特。

    您的代码将类似于

    @Inject
    public MyClass(ProcessorProvider processorProvider) {
        this.processorProvider = processorProvider;
    }
    
    public boolean myMethod(String anInputValue) {
        return processorProvider.get().isEnabled(anInputValue);
    }
    

    【讨论】:

    • 非常感谢,这似乎就是我想要的。有时你看不到所有树木的森林。
    • 你会想从你的调试模块中绑定一个 DebugProcessorProvider,但如果你一直在使用 Guice,你可能已经想通了。
    • 看到 API 现在已更改为 Process.isEnabled(anInputValue) (与我的回复相同),为什么还要现在包含一个提供程序?为什么不只拥有一个处理器并完全跳过提供程序?
    • MrWiggles:很抱歉我的第一条评论。你当然是对的。我在示例中未能识别的是提供程序也没有任何参数。 @Assisted 是要走的路,即使这个例子在这方面是不正确的。我现在注入一个ProcessorFactory。相应地更改了接受的答案。
    • 更正了示例中的错误。并同意@Assisted 是要走的路。
    【解决方案3】:

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

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

    【讨论】:

    • 处理器实现被设计成不可变的,用他们需要的所有数据创建一次,然后只向他们索要东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2015-08-19
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多