為了統一各種依賴注入架構的程式設計模型,JCP釋出了Java依賴注入規範,JCP将其稱為JSR-330.從Spring3開始,Spring已經開始相容該注入模型
@Inject是JSR-330的核心部件。該注解幾乎可以完全替代Spring的@Autowried注解。
@Inject
private Foo foo
和@Autowried一樣,@Inject可以自動裝配屬性、方法和構造器。
但和@Autowried不同的是,@Inject沒有required屬性。是以,@Inject的注解标注的依賴關系必須存在,如果不存在,則會抛出異常。
除了@Inject注解,JSR-330還提供了另外一種技巧,語氣直接注入一個引用,不如要求@Inject注入一個Provider。Provider借口可以實作Bean引用的延遲注入以及注入Bean的多個執行個體等功能。
例如,我們有一個KnifeJuggler類需要注入一個或者多個Knife的執行個體。假設Knife Bean的作用域為prototype(非單例),下面的KnifeJuggle的構造器将獲得5哥KnifeBean。
private Set<Knife> knives;
@Inject
public KnifeJuggle(Provider<Knife> knifeProvider){
knives = new HashSet<Knife>();
for (int i=0;i<5;i++){
knives.add(knifeProvider.get());
}
}
KnifeJuggler将獲得一個Provider<Knife>,而不是在構造器中獲得一個knife執行個體。這個時候,隻有Provider被注入進去;在調用knifeprovide.get()方法錢,實際的knife并沒有被注入進去。調用5次,放入5個不同的knife對象。
限定@Inject所标注的屬性
與@autowired的限定@qualifier類似,@Inject的限定為@Named。
@Inject
@Named(”guitar“)
private Foo foo;
Spring的@qualifier與JSR-330的@Named的關鍵差別在語義層面。@qualifier注解是縮小所拼配bean的選擇範圍(預設是Bean的id),而@Name通過Bean的Id來标示的。
建立自定義的JSR-330的Qualifier
與@Autowried的自定義Qualifier幾乎一樣,唯一差別注解的導入生聲明。如下
//spring的@Autowried的@Qualifier自定義聲明
import org.springframework.beans.factory.annotation.Qualifier;
//JSR-330 @Inject的@Qualifier自定義聲明
import javax.inject.Qualifier;