Guice指南-用Guice實現依賴注入

梧桐雨—168發表於2008-03-21


手工為每一個服務與客戶實現工廠類和依賴注入邏輯是一件很麻煩的事情。其他一些依賴注入框架甚至需要你顯式將服務對映到每一個需要注入的地方。

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 使你保持正確的方向。

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-214953/,如需轉載,請註明出處,否則將追究法律責任。

相關文章