Java 依賴注入標準 JSR-330 簡介

Java 依賴注入標準 JSR-330 簡介

概念

JSR-330Java 的依賴注入標準。定義瞭如下的術語描述依賴注入:

  • A 類型依賴 B類型(或者說 B 被 A 依賴),則 A類型 稱爲”依賴(物) dependency
  • 運行時查找依賴的過程,稱爲”解析 resolving“依賴
  • 如果找不到依賴的實例,稱該依賴是”不能滿足的 unsatisfied
  • 在”依賴注入 dependency injection”機制中,提供依賴的工具稱爲”依賴注入器 dependency injector”

在標準中, 依賴是類型而不是實例/對象; 在程序中(運行時), 需要的是依賴的實例.

標準對依賴注入的使用進行了定義, 但是對實現和配置未定義。Java EEjavax.inject對應該標準。其中也僅定義了依賴注入的使用(即通過註解),同樣也未定義依賴注入的配置方式和實現方式。實際上,依賴配置方式和實現方式由”依賴注入器“定義和實現。注入器的配置方式常見有XML註解DSLJava 代碼; 實現方式有反射和代碼生成。依賴注入器在構建時,會驗證所有依賴是否滿足(通過識別註解來得知其依賴),在運行時爲類注入其需要的依賴的實例。(因爲依賴注入器對依賴的識別過程就是對註解的處理,所以依賴注入器也是註解處理器)。

javax.injects

該包提供瞭如下5個註解(Inject、Qualifier、Named、Scope、Singleton)和1個接口(Provider)。

@Inject

標識某個類中,需要由注入器注入的類成員(被標識的成員稱爲”可注入的”)。

使用規則

  1. 可用於註解構造器、字段、方法這些類成員(對成員是靜態與否、最好是public的)
  2. 每個類只能有一個構造器可以被標記可注入;空構造器可以不用@Inject註解。
  3. 可注入的字段不能爲 final 的
  4. 可注入的方法不能爲 abstract 的

注入器的依賴注入順序

  1. 構造器 > 字段 > 方法
  2. 父類 > 子類
  3. 一個類的兩個可注入字段或其他成員無注入順序

另外的四個註解對依賴注入進一步進行配置。

@Qualifier 和 @Named

其中,@Qualifiery用於創建限定器。限定器是一個自定義的註解,可註解字段或方法的參數,用於限制可注入的依賴的類型。限定器註解必須被 @Qualifier 和 @Retention(RetentionPolicy.RUNTIME) 註解。

// 定義限定器
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Big {

}

// 使用限定器
@Inject
public void foo(@ Big Bar bar) {
    // some code
}

@Named 就是一個通過 @Qualifier 定義的限定器。

@Scope 和 @Singleton

其中,@Scope 用於創建作用域。作用域是一個自定義的註解,可註解構造器,用於要求注入器對注入的實例的創建方式。比如,是每次構造器被調用就創建一個依賴的實例,還是就創建一個依賴的實例然後重用。作用域註解必須被 @Scope 和 @Retention(RetentionPolicy.RUNTIME) 註解。

@ Singleton 就是一個通過 @Scope 定義的作用域。

Provider<T>

Provider 作爲另一種提供依賴的定義(有一種是 @Inject 註解),其實例提供 T 類型的實例。與 @Inject 註解相比,其還能:

  • 返回的實例可以是多個
  • 返回的實例可以是延遲返回的
  • 返回的實例來自指定作用域內(不明覺厲)

參考

  1. Java 依賴注入標準(JSR-330)簡介
  2. Inject Javadoc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章