Guice的依赖注入:任何教程都没有涉及的东西

时间:2009-06-24 13:46:15

标签: java dependency-injection guice

我只是用Google Guice修改了依赖注入,并开始将它集成到我现有的应用程序中。到现在为止还挺好。我有许多类,除了它们的依赖项,还需要Strings,DataSources等等。我知道有NamedBindings,但我真的不想为每个简单的字符串创建一个注释,我必须传递给每个类的构造函数。然后,有一个名为AssistedInject的东西,为我创建Factory实现。哇,但我还是要定义工厂的界面。这对于具有依赖关系的类是否可以,但是这个示例类呢:

public class FooBarClass {
    public FooBarClass(String name, String anotherOne) {
        // Some stuff
    }
}

有些情况下,我怀疑如何使用Guice,或者更一般地说,DI是正确的方式。 “我经常听到:XYZ框架是新的。”但这暗示我必须使用DI框架创建每个实例。

只需要一个实例

如果我只需要这个类的一个实例怎么办?除了两个字符串之外,这个类绝对没有依赖性。想想一个Shutdown Hook,它只会被实例化一次并作为我的Shutdown Hook传递给JVM。我应该用Guice创建这个实例吗?这看起来非常愚蠢,因为没有什么可注入,但我必须编写一个工厂接口来传递Guide两个参数,并且必须为我的FooBarClass创建一个接口来使用DI。

需要多个实例

同样的事情适用于我需要此类的多个实例的情况。没有依赖关系,但我必须创建一堆样板代码才能从中获取任何东西。这对我来说似乎不对。

那么,我应该如何使用DI和/或Guice?

非常感谢!

3 个答案:

答案 0 :(得分:23)

数据中拆分依赖关系可能会有所帮助。

  • 依赖关系通常是服务:数据库,时钟和RPC存根。此外,所有应用程序代码都包含在这些代码中:UserAuthenticatorPaymentHandlerEmailGateway
  • 数据就是:DateMap<String,InetAddress>甚至是Customer。这些是简单的内存域对象。

DI自然最适合事物的依赖性。您应该继续使用new作为数据模型类。

答案 1 :(得分:2)

如果您要创建多个实例,例如单个客户,则注入它们没有意义。有意义的是创建一个CustomerFactory,它可能是@Singleton范围,可以创建具有所有依赖关系的Customer实例。

答案 2 :(得分:2)

如果要在测试特定类时忽略(隔离)其复杂性,请注入依赖项。如果类只是一个数据持有者,它的代码是微不足道的(get,set,equals)。在测试目标类时,您不需要模拟它,因此注入数据实例是过度的(通常很难)。如果代码不是很简单,那么该类不仅仅是一个数据持有者,你应该在单元测试中注入和模拟它。