guice:Guice指南-用Guice实现依赖注入

手工为每一个服务与客户实现工厂类和依赖注入逻辑是一件很麻烦的事情。其他一些依赖注入框架甚至需要你显式将服务映射到每一个需要注入的地方。
Guice 希望在不牺牲可维护性的情况下去除所有这些程式化的代码。
使用 Guice,你只需要实现模块类。Guice 将一个绑定器传入你的模块,你的模块使用绑定器来连接接口和实现。以下模块代码告诉 Guice 将 Service 映射到单件模式的 ServiceImpl:

public class MyModule implements Module {
public void configure(Binder binder) {
binder.bind(Service.class)
.to(ServiceImpl.class)
.in(Scopes.SINGLETON);
}
}
模块类告诉 Guice 我们想注入什么东西。那么,我们该如何告诉 Guice 我们想把它注入到哪里呢?使用 Guice,你可以使用 @Inject 标注你的构造器,方法或字段:

public class Client {
private final Service service;
@Inject
public Client(Service service) {
this.service = service;
}
public void go() {
service.go();
}
}
@Inject 标注可以清楚地告诉其他程序员你的类中哪些成员是被注入的。
为了让 Guice 向 Client 中注入,我们必须直接让 Guice 帮我们创建 Client 的实例,或者,其他类必须包含被注入的 Client 实例。
Guice vs. 手工依赖注入
如你所见,Guice 省去了写工厂类的麻烦。你不需要编写代码将客户连接到它们所依赖的对象。如果你忘了提供一个依赖关系,Guice 在启动时就会失败。Guice 也会自动处理循环依赖关系。
Guice 允许你通过声明指定对象的作用域。例如,你需要编写相同的代码将对象反复存入 HttpSession。
实际情况通常是,只有到了运行时,你才能知道具体要使用哪一个实现类。因此你需要元工厂类或服务定位器来增强你的工厂模式。Guice 用最少的代价解决了这些问题。
手工实现依赖注入时,你很容易退回到使用直接依赖的旧习惯,特别是当你对依赖注入的概念还不那么熟悉的时候。使用 Guice 可以避免这种问题,可以让你更容易地把事情做对。Guice 使你保持正确的方向。




[url=http://mail.qq.com/zh_CN/htmledition/announcement_qzone.html][ft=#FFFFFF,,]此旍
Tags:  依赖注入的原理 什么是依赖注入 依赖注入 guice

延伸阅读

最新评论

发表评论