任何人都可以清楚地解释为什么Google Guice有用吗?

时间:2009-09-22 21:12:42

标签: java guice

我读过关于Google Guice的内容,并了解其他依赖注入方法的一般问题,但是我还没有看到有人在实践中使用Guice的例子,其价值变得清晰。

我想知道是否有人知道这些例子吗?

3 个答案:

答案 0 :(得分:43)

使用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;
    }
}

B类现在松散地耦合到A,而Guice负责提供A的实例,而不是B必须实例化它。有了这个,您可以扩展它以提供A到B的接口,如果您想对应用程序进行单元测试,则实现可以是Mock对象。

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

  1. Guice有一个非常干净的构造函数Injection实现。从示例中可以看出,您只需添加@Inject注释构造函数。
  2. Guice也使用相同的注释设置了注入。
  3. 话虽如此,与基于XML的注入相比,基于注释的注入是非常干净的方法,就像其他一些DI实现一样。
  4. 所有依赖注入和配置都使用Java,因此默认情况下,您可以确保在应用程序中获得类型安全。
  5. Guice有一个非常轻量级的面向方面编程实现(或者你可以称之为AOPAlliance AOP实现的包装)。它的好处是它不会产生存根或者不会产生任何结果。
  6. 这是它的概述。但随着你对Guice的深入了解,它还有很多好处。一个简单现实生活中的例子就是如果你使用GWT with MVP implementation,你的GWT应用程序中的组件/小部件是非常松散耦合的,而不是彼此紧密集成。

答案 1 :(得分:17)

也许你应该回过头来仔细研究Guice想要解决的问题。要了解Guice背后的动机,TheServerSide.COM上的Bob Lee: I Don't Get Spring新闻(及其评论)是一个完美的起点。然后,继续发布Google Guice, A Java Dependency Injection Framework(和评论)和Tech Talk: Bob Lee on Google Guice(以及评论)的公告。

就个人而言,我分享了对邪恶的XML的关注:XML配置地狱,XML和可能的运行时错误,容易出错和重构 - 不良的字符串标识符等等。实际上,我认为对Spring的怀疑观点和同意是好的为每个人(包括春天)。我很高兴看到DI框架中的新玩家,特别是利用Java 5功能的现代框架(为了类型安全而使用泛型和注释)。

因为Google在任务关键型应用程序中运行Guice(几乎每个基于Java的应用程序都是基于Guice的应用程序: AdWords ,Google Docs,Gmail,甚至是YouTube报道的“Crazy” “鲍勃李在Guice²),我不敢相信Guice是完全错误的,并没有提供任何价值。遗憾的是,我认为Google不会提供这些应用程序的大量代码作为示例...但您可能会在list of applications that use Guice和/或list of 3rd party Guice addons中找到有趣的内容。或者查看Guice²中提到的书籍。或者问鲍勃:)

答案 2 :(得分:4)

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

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

对于Guice,Spring,PicoContainer和所有DI框架都是如此。

足够简洁?