42

我已经阅读了有关 Google Guice 的信息,并了解其他依赖注入方法的一般问题,但是我还没有看到有人在“实践”中使用 Guice 的例子,它的价值变得清晰。

我想知道是否有人知道任何这样的例子?

4

3 回答 3

46

使用 Google Guice 简化单元测试只是高级别的优势。有些人甚至可能不会在他们的项目中使用单元测试。人们一直在使用 Spring/Dependency Injection,而不仅仅是用于单元测试。

使用 Google Guice 的低级优势在于应用程序的内聚性,项目中的类之间可以松散耦合。我可以为另一个类提供一个类,而不需要它们相互依赖。

考虑这个例子:

public class A {

}

public class B {
  A a = new A();
}

B 类将与 A 类紧密耦合,或者换句话说,它依赖于 A 类的存在。

但是使用 Guice,我可以改为像这样松散耦合:

public class B {
    private A a;
    
    @Inject
    public B(A a) {
        this.a = a;
    }
}

ClassB现在与 松散耦合A,Guice 负责提供实例A而不是B实例化它。有了这个,你可以扩展它来提供 to 的接口,A如果B你想对你的应用程序进行单元测试,实现可以是一个 Mock 对象。

话虽如此,到目前为止我们只是在讨论依赖注入的好处。除了依赖注入之外,使用 Google Guice 的好处是:

  1. Guice 有一个非常干净的构造函数注入实现。从示例中可以看出,您只需添加@Inject注释构造函数。
  2. Guice 也有使用相同注解的 setter Injection。
  3. 话虽如此,与基于 XML 的注入(如其他 DI 实现)相比,基于注解的注入是非常干净的方法。
  4. 所有依赖注入和配置都使用 Java,因此默认情况下可以保证在应用程序中获得类型安全。
  5. Guice 有一个非常轻量级的面向方面编程的实现(或者您可以将其称为 AOPAlliance AOP 实现的包装器)。它的好处是它不会生成存根或任何东西。

这就是它的概述。但是随着您对 Guice 的深入了解,它还有更多的好处。一个简单的现实生活示例是,如果您将GWT 与 MVP 实现一起使用,则 GWT 应用程序中的组件/小部件非常松散耦合,并且彼此之间没有紧密集成。

于 2009-09-23T02:22:34.917 回答
19

也许你应该回到过去,仔细看看 Guice 想要解决的问题。要了解 Guice 背后的动机,Bob Lee: I Don't Get Spring news on TheServerSide.COM(及其评论)是一个完美的起点。然后,继续发布Google Guice、Java 依赖注入框架(和评论)和技术讲座:Bob Lee 关于 Google Guice(和评论)。

就我个人而言,我分享了对邪恶 XML 的担忧:XML 配置地狱、XML 和可能的运行时错误、容易出错和不利于重构的字符串标识符等等。实际上,我相信对 Spring 和并发持怀疑态度对每个人都有好处(包括春天)。因此,我很高兴看到 DI 框架领域的新参与者,尤其是利用 Java 5 特性(为了类型安全的泛型和注释)的现代框架。

而且因为 Google 在关键任务应用程序中运行 Guice(几乎每个基于 Java 的应用程序也是基于 Guice 的应用程序:AdWords、Google Docs、Gmail,甚至是Guice²中“Crazy” Bob Lee 报道的 YouTube ),我可以'不要相信 Guice 是完全错误的并且没有提供任何价值。遗憾的是,我认为 Google 不会提供太多这些应用程序的代码作为示例……但是您可能会在使用 Guice 的应用程序列表和/或3rd party Guice 插件列表中找到有趣的东西。或者查看Guice²中提到的书籍。或者问鲍勃:)

于 2009-09-23T04:07:19.787 回答
4

我认为优势在于对接口、测试和代理进行编码。

对接口进行编码有助于保持代码正确分层,可以注入模拟进行测试,并让您自动生成代理,因此客户端代码无需担心实现。

Guice、Spring、PicoContainer 和所有 DI 框架都是如此。

够简洁吗?

于 2009-09-23T00:12:34.517 回答