通过Guice进行依赖项注入 - 编程入门网
n "Mock Vehicle Zoomed.";
}
}
public void testFrogManFightsCrime() {
MockVehicle mockVehicle = new MockVehicle();
FrogMan hero = new FrogMan(mockVehicle);
hero.fightCrime();
assertTrue(mockVehicle.didZoom);
// other assertions
}
这个测试使用了一个手动编写的 mock 对象来替换 FrogMobile。DI 不仅在测试中省去了 麻烦的 refinery 启动过程,而且使测试不用了解 FrogMobile 具体细节。需要的仅是一个 Vehicle 接口。除了使测试变得更简单之外,DI 还有助于提高代码的总体模块性和可维护性 。现在,如果想将 FrogMobile 切换为 FrogBarge,可以不修改 FrogMan。所有 FrogMan 都 依赖于 Vehicle 接口。 不过这里有一个陷阱。如果您是第一次阅读 DI,可能会想:“这下好了,现在所有 FrogMan 的调用方 都必须知道 FrogMobile(refinery、refinery 的依赖项,依此类推…… )”。但如果是这样,DI 就永远不会这么流行。您可以不增加调用方的负担,而是编写一些 工厂 来管理对象及其依赖项的创建。 工厂是存放框架的地方。工厂需要大量冗长重复的代码。工厂往往会让程序员(和读者) 很痛苦,他们甚至会嫌它麻烦而放弃编写。Guice 和其他 DI 框架可作为 “超级工厂”,您 可以通过配置它们来构建对象。配置 DI 框架比自己编写工厂容易得多。因此,程序员编写 的代码大部分是 DI 样式的。测试越多代码就越好,程序员以后也就越省事。 通过 Guice 进行基本注入 我希望在我的介绍之后,您会相信 DI 能为您的设计增加价值,而且使用框架会使工作更 轻松。现在让我们从 @Inject 注释和模块开始深入讨论 Guice。 告诉 Guice 给类添加 @Inject FrogMan 与 Guice 上的 FrogMan 之间的唯一区别是 @Inject。清单 5 显示了 FrogMan 带有注释的构造函数: 清单 5. FrogMan 已经加上 @Inject
一些工程师不喜欢给类添加 @Inject。他们更喜欢一个完全忽略 DI 框架的类。这种说法 有一定道理,但是我不大赞同。依赖项的注入会使注释的作用更加明显。@Inject 标记只在 您要求 Guice 构建类时才有意义。如果不要求 Guice 构建 FrogMan,这个注释对代码行为 就没有任何影响。这个注释恰当地指出了 Guice 将参与构建类。但是,使用它需要源代码级 别的访问。如果这个注释带来不便,或者正在使用 Guice 创建无法控制其源代码的对象,那 么 Guice 就会用一个替代机制(请参阅本文后面的 provider 方法的其他用法 侧边栏)。 告诉 Guice 您需要哪个依赖项 Guice 知道您的 hero 需要一个 Vehicle 后,它需要知道提供什么 Vehicle。清单 6 包 含一个 Module:一个特殊的类,用于告诉 Guice 各个接口对应的实现。 清单 6. HeroModule 将 Vehicle 绑定到 FrogMobile
模块就是一个具有某种单实例对象方法的接口。Guice 传递给模块的 Binder 用于告诉 Guice 您想如何构造对象。绑定程序 API 形成一种 区域特定语言(请参阅 参考资料)。这 种小语言允许您编写表达式代码,比如 bind(X).to(Y).in(Z)。后面将提供更多有关绑定程 序作用的例子。每次调用 bind 都会创建一个绑定,Guice 将使用绑定集解析注入请求。 通过Guice进行依赖项注入(3)时间:2011-04-09 IBM Nicholas Lesiecki使用 Injector 启动 然后,使用 Injector 类启动 Guice。通常需要尽早在程序中创建注入器。这样 Guice 能够帮助您创建大部分对象。清单 7 包含一个以 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |