【发布时间】:2009-09-22 21:12:41
【问题描述】:
我已经阅读了有关 Google Guice 的信息,并且了解其他依赖注入方法的一般问题,但是我还没有看到有人在“实践”中使用 Guice 的例子,它的价值变得清晰。
我想知道是否有人知道任何此类示例?
【问题讨论】:
我已经阅读了有关 Google Guice 的信息,并且了解其他依赖注入方法的一般问题,但是我还没有看到有人在“实践”中使用 Guice 的例子,它的价值变得清晰。
我想知道是否有人知道任何此类示例?
【问题讨论】:
使用 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 的好处还有:
@Inject 注释构造函数。这就是它的概述。但是随着您对 Guice 的深入了解,它还有更多的好处。一个简单现实生活中的例子是,如果您使用GWT with MVP implementation,您的 GWT 应用程序中的组件/小部件耦合非常松散,并且彼此之间没有紧密集成。
【讨论】:
B 与A 不耦合,但它似乎是您提到的唯一优势现在您可以提供一个模拟对象进行测试。在我看来,B 似乎仍然与A 耦合,但它不再负责实际构建实例。
也许你应该回到过去,仔细看看 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² 中提到的书籍。或者问鲍勃:)
【讨论】:
我认为优势在于对接口、测试和代理进行编码。
对接口进行编码有助于保持代码正确分层,可以注入模拟进行测试,并让您自动生成代理,因此客户端代码无需担心实现。
Guice、Spring、PicoContainer 和所有 DI 框架都是如此。
够简洁了吧?
【讨论】: