依賴注入 (DI) 是企業級 Java 開發主流技術,Spring、Guice 等框架雖廣泛採用基於註解的 DI,但彼此不相容。Java EE 6 隨 JSR 330(Dependency Injection for Java)發布,提供標準化、可擴展的 DI API,解決此困境。
@Inject:標記可注入的建構子、方法、欄位@Qualifier:定義強類型限定符,區分同類型不同實例(如 @Red Car vs @Blue Car)@Scope:標記註解作用域@Singleton:標記注入器僅實例化一次的類型class Stopwatch {
final TimeSource timeSource;
@Inject Stopwatch(TimeSource timeSource) {
this.timeSource = timeSource;
}
void start() { ... }
long stop() { ... }
}
class StopwatchWidget {
@Inject StopwatchWidget(Stopwatch sw) { ... }
}
注入器會自動解析依賴鏈:先建立 TimeSource,再建構 Stopwatch,最後建構 StopwatchWidget。
標準化註解讓可注入類別得以跨框架遷移,開發者無需綁定特定廠商註解。注意:建構於 JSR 330 之上的 CDI (Contexts and Dependency Injection) 還增加了自動發現、可注入類別配置、運行時定義新可注入類別 API、第三方框架整合支援等功能。JCP 成員對 JSR 330 存在爭議,詳見 JSR 330 通過時各方爭議總結。