天天看點

spring自動裝配[email protected]

   為了統一各種依賴注入架構的程式設計模型,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;