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

2022-09-01 02:01:54

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

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


答案 1

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

类现在松散耦合到 ,Guice 负责提供 实例,而不必实例化它。有了这个,你可以扩展它以提供 to 的接口,并且如果你想要对应用进行单元测试,则实现可以是 Mock 对象。BAABAB

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

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

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


答案 2

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

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

而且由于Google在关键任务应用程序中运行Guice(几乎每个基于Java的应用程序也是基于Guice的应用程序:AdWords,Google Docs,Gmail,甚至YouTube,正如Guice²中“Crazy”Bob Lee所报道的那样),我不敢相信Guice是完全错误的,并且没有提供任何价值。可悲的是,我不认为谷歌会提供这些应用程序的很多代码作为示例......但是,您可能会在使用 Guice 的应用程序列表和/或第三方 Guice 插件列表中找到有趣的东西。或者查看Guice²中提到的书籍。或者问鲍勃·:)


推荐