標准化的依賴注入注解
依賴注入是開發企業Java應用程序的一種流行技術,在依賴注入中,也叫做反轉控制,一個組件指定它依賴的資源,一個注入器通常是一個容器,它為組件提供資源,雖然依賴注入有多種實現方式,但許多開發人員習慣使用注解來實現它。依賴注入在Java開發框架中得到了廣泛使用,如Spring和Guice。遺憾的是,之前還沒有基於注解構建依賴注入的標准方法,特別需要注意的是,Sping框架采用的基於注解的依賴注入方法與Guice采用的方法不一樣。
隨著Java EE 6的發布,這個問題得到了解決,隨Java EE 6發布的JSR 330:Java依賴注入改變了這種境況,這個規范的目標是為依賴注入提供一個標准的,可擴展的API。
API由一套用在可注入類上的注解組成,這些注解包括:
@Inject:標識可注入的構造器,方法和字段;
@QualifIEr:標識合法的注解,合法的是強類型鍵,它可以幫助區分相同類型的對象不同使用方法。例如,@Red Car和@Blue Car可以理解為相同類型的不同實例,在這個例子中,@Red和@Blue是合法的;
@Scope:標識注解范圍;
@Singleton:標識注入器只實例化一次的類型。
例如,下面的類Stopwatch使用@Inject注解在TimeSource類上注入一個依賴;
- class Stopwatch {
- final TimeSource timeSource;
- @Inject Stopwatch(TimeSource TimeSource) {
- this.TimeSource = TimeSource;
- }
- void start() { ... }
- long stop() { ... }
- }
依賴注入可以通過其它注入進行擴展,例如,假設你想創建一個StopwatchWidget類,它在Stopwatch類上有一個依賴,那麼你可以象下面這樣定義這個類:
- class StopwatchWidget {
- @Inject StopwatchWidget(Stopwatch sw) { ... }
- ...
- }
JSR 330制定的標准化注解使可注入類可以跨框架遷移,你不用再為特定廠商的注解忙碌了。
注意在JSR 330上構建的CDI和向依賴注入增加的新功能,包括自動發現,可注入類的配置,在運行時定義新的可注入類的API,幫助與第三方框架集成。(51CTO編輯注:針對Java EE 6當中的JSR 330依賴注入,JCP成員們當中是存在一些爭議的,具體可參考這篇JSR 330通過時各方爭議的總結文章)