- 1、本文档共13页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Guice_1.0_用户指南
用 Guice 写 Java
Guice 1.0 用户指南
王咏刚 译自:/Doc?id=dd2fhx4z_5df5hw8)
Guice (读作juice)是超轻量级的,下一代的,为 Java 5及后续版本设计的依赖注入容器。
简介
Java企业应用开发社区在连接对象方面花了很大功夫。你的Web 应用如何访问中间层服务?你的服务如何连
接到登录用户和事务管理器?关于这个问题你会发现很多通用的和特定的解决方案。有一些方案依赖于模式,
另一些则使用框架。所有这些方案都会不同程度地引入一些难于测试或者程式化代码重复的问题。你马上就会
看到,Guice 在这方面是全世界做得最好的:非常容易进行单元测试,最大程度的灵活性和可维护性,以及最
少的代码重复。
我们使用一个假想的、简单的例子来展示 Guice 优于其他一些你可能已经熟悉的经典方法的地方。下面的例子
过于简单,尽管它展示了许多显而易见的优点,但其实它还远没有发挥出 Guice 的全部潜能。我们希望,随着
你的应用开发的深入,Guice 的优越性也会更多地展现出来。
在这个例子中,一个客户对象依赖于一个服务接口。该服务接口可以提供任何服务,我们把它称为
Service。
public interface Service {
void go();
}
对于这个服务接口,我们有一个缺省的实现,但客户对象不应该直接依赖于这个缺省实现。如果我们将来打算
使用一个不同的服务实现,我们不希望回过头来修改所有的客户代码。
public class ServiceImpl implements Service {
public void go() {
...
}
}
我们还有一个可用于单元测试的伪服务对象。
public class MockService implements Service {
private boolean gone = false;
public void go() {
gone = true;
}
public boolean isGone() {
return gone;
}
}
简单工厂模式
在发现依赖注入之前,最常用的是工厂模式。除了服务接口之外,你还有一个既可以向客户提供服务对象,也可以向
测试程序传递伪服务对象的工厂类。在这里我们会将服务实现为一个单件对象,以便让示例尽量简化。
public class ServiceFactory {
private ServiceFactory() {}
private static Service instance = new ServiceImpl();
public static Service getInstance() {
return instance;
}
public static void setInstance(Service service) {
instance = service;
}
}
客户程序每次需要服务对象时就直接从工厂获取。
public class Client {
public void go() {
Service service = ServiceFactory.getInstance();
service.go();
}
}
客户程序足够简单。但客户程序的单元测试代码必须将一个伪服务对象传入工厂,同时要记得在测试后清理。
在我们这个简单的例子里,这不算什么难事儿。但当你增加了越来越多的客户和服务代码后,所有这些伪代码
和清理代码会让单元测试的开发一团糟。此外,如果你忘记在测试后清理,其他测试可能会得到与预期不符的
结果。更糟的是,测试的成功与失败可能取决于他们被执行的顺序。
public void testClient() {
Service previous = ServiceFactory.getInstance();
try {
final MockService mock = new MockService();
ServiceFactory.setInstance(mock);
Client client = new Client();
client.go();
assertTrue(mock.isGone());
}
finally {
ServiceFactory.setInstance(previous);
}
}
最后,注意服务工厂的API把我们限制在了单件这一种应用模式上。即便 getInstance() 可以返回多个实例,
您可能关注的文档
- Five_Star_Evaluation_Program.pdf
- Fixed-Angle Elastic Hadron Scattering.pdf
- FlatnessControlB_省略_orColdStripMills_ed6.pdf
- Flexiclassic-快速指引.pdf
- FlexMix A general framework for finite.pdf
- Flex中的CSS样式.pdf
- Flow-sensitive interprocedural constant propagation.pdf
- FLOWSIC600气体超声波流量计简介.pdf
- flowsic600.pdf
- Fluke 73-III Manual.pdf
文档评论(0)