Java 有人能清楚地解释一下为什么GoogleGuice很有用吗?

Java 有人能清楚地解释一下为什么GoogleGuice很有用吗?,java,guice,Java,Guice,我已经阅读了关于GoogleGuice的文章,并且理解了其他依赖注入方法的一般问题,但是我还没有看到有人“在实践中”使用Guice的例子,它的价值变得很清楚 我想知道是否有人知道这样的例子?我认为编码到接口、测试和代理的好处来了 对接口进行编码有助于保持代码的正确分层,可以为测试注入模拟,并允许自动生成代理,这样客户端代码就不必担心实现问题 Guice、Spring、PicoContainer和所有DI框架都是如此 足够简洁?使用GoogleGuice简化单元测试是唯一的高级优势。有些人甚至可能

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


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

我认为编码到接口、测试和代理的好处来了

对接口进行编码有助于保持代码的正确分层,可以为测试注入模拟,并允许自动生成代理,这样客户端代码就不必担心实现问题

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


足够简洁?

使用GoogleGuice简化单元测试是唯一的高级优势。有些人甚至可能不在他们的项目中使用单元测试。人们一直在使用Spring/依赖项注入,而不仅仅是用于单元测试

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

考虑这个例子:

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
的接口,如果你想对你的应用进行单元测试,这个实现可以是一个模拟对象

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

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

  • 这是它的概述。但是随着你对Guice的深入了解,它还有很多优点。一个简单的现实例子是,如果您正在使用,那么GWT应用程序中的组件/小部件是松散耦合的,彼此之间没有紧密集成。

    也许您应该回到过去,仔细看看Guice想要解决的问题。要了解Guice背后的动机,ServerSide.COM上的新闻(及其评论)是一个完美的起点。然后,继续发布(和评论)和(和评论)

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


    而且,由于谷歌在关键任务应用程序中运行Guice(几乎所有基于Java的应用程序都是Guice基础应用程序:AdWords、谷歌文档、Gmail,甚至是YouTube,正如《疯狂》Bob Lee在年报道的那样),我不能相信Guice是完全错误的,没有提供任何价值。遗憾的是,我认为谷歌不会提供太多这些应用程序的代码作为示例。。。但是你可能会在和/或中发现有趣的事情。或者看看书中提到的书。或者问鲍勃:)

    你所说的“重构不利的字符串标识符”到底是什么意思?你能稍微扩展一下吗?你首先说测试只是一个高级,不是唯一的优势,但是你展示了
    B
    如何不与
    a
    耦合,但是你提到的唯一优势似乎是现在你可以为测试提供一个模拟对象。对我来说,
    B
    似乎仍然与
    A
    耦合,但它不再负责实际构建实例。我已经阅读Guice几天了,我觉得,人们只是想用它来破解它。我曾经在大约有8000万行代码的产品上工作过,但代码在不需要的地方仍然没有紧密耦合。第二个问题:代码紧密耦合有什么问题。对于测试部分,您实际上可以使用PowerMockito之类的框架来模拟任何东西。我们将项目划分为模块,模块类内部是紧密耦合的,外部是由接口驱动的