Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选

首页 / 软件开发 / JAVA / 用Guice写Java

用Guice写Java2011-04-02王咏刚简介

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();
}
}