【问题标题】:Can anyone provide a clear explanation of why Google Guice is useful?任何人都可以清楚地解释为什么 Google Guice 有用吗?
【发布时间】:2009-09-22 21:12:41
【问题描述】:

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

我想知道是否有人知道任何此类示例?

【问题讨论】:

    标签: java 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;
        }
    }
    

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

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

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

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

    【讨论】:

    • 您首先说测试只是一个高级别的,而不是唯一的优势,但是您展示了现在BA 不耦合,但它似乎是您提到的唯一优势现在您可以提供一个模拟对象进行测试。在我看来,B 似乎仍然与A 耦合,但它不再负责实际构建实例。
    • 我已经阅读 Guice 几天了,我觉得人们只是想用它来破解它。我曾开发过可能有 80 m 行代码的产品,但代码在不需要的地方仍然没有紧密耦合。第二个问题:代码紧密耦合有什么问题。对于测试部分,您几乎可以使用 PowerMockito 等框架模拟任何东西。我们将项目划分为模块,在模块类内部存在紧密耦合,外部由接口驱动
    【解决方案2】:

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

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

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

    【讨论】:

    • “重构不利字符串标识符”到底是什么意思?能不能稍微展开一下?
    【解决方案3】:

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

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

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

    够简洁了吧?

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 2011-09-20
      • 2013-09-09
      • 2012-02-14
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2015-05-24
      相关资源
      最近更新 更多