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

上一篇 / 下一篇  2008-03-21 17:21:20 / 个人分类: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 使你保持正确的方向。

 

 

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18137
  • 日志数: 171
  • 影音数: 3
  • 建立时间: 2008-02-28
  • 更新时间: 2008-05-19

RSS订阅

Open Toolbar