1. 程式人生 > >依賴注入 javax inject中 Inject Named Qualifier和 Provider用法

依賴注入 javax inject中 Inject Named Qualifier和 Provider用法

                Spring自帶的@Autowired的預設情況等價於JSR-330的@Inject註解;Spring自帶的@Qualifier的預設的根據Bean名字注入情況等價於JSR-330的@Named註解;Spring自帶的@Qualifier的擴充套件@Qualifier限定描述符註解情況等價於JSR-330的@Qualifier註解。

用過Spring框架的我們都知道,每當生成依賴注入的時候,我們都必須生成相應類的set方法,而且要在set方法上面寫上@Autowired,才能實現依賴注入,如下:

Java程式碼  收藏程式碼
  1. package com.kaishengit.web;  
  2. import com.kaishengit.service.ProjectService;  
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Controller;  
  5. @Controller  
  6. public
     class FolderController {  
  7.     private ProjectService projectService;  
  8.     //set  
  9.     @Autowired  
  10.     public void setProjectService(ProjectService projectService) {  
  11.         this.projectService = projectService;  
  12.     }  
  13. }  

 每次都要生成相應的set方法感覺好麻煩,現在如果我們使用javax.inject.jar,只需要在相應類的屬性上面加上@Inject,如下程式碼:

Java程式碼  
收藏程式碼
  1. package com.kaishengit.web;  
  2. import com.kaishengit.service.ProjectService;  
  3. import org.springframework.stereotype.Controller;  
  4. import javax.inject.Inject;  
  5. @Controller  
  6. public class FolderController {  
  7.     @Inject  
  8.     private ProjectService projectService;  
  9. }  

@Inject

    @Inject支援建構函式、方法和欄位註解,也可能使用於靜態例項成員。可註解成員可以是任意修飾符(private,package-private,protected,public)。注入順序:建構函式、欄位,然後是方法。父類的欄位和方法注入優先於子類的欄位和方法,同一類中的欄位和方法是沒有順序的。

    @Inject註解的建構函式可以是無參或多個引數的建構函式。@Inject每個類中最多註解一個建構函式。

    在欄位註解:

  • 用@Inject註解
  • 欄位不能是final的
  • 擁有一個合法的名稱

    在方法上註解:

  • 用@Inject註解
  • 不能是抽象方法
  • 不能宣告自身引數型別
  • 可以有返回結果
  • 擁有一個合法的名稱
  • 可以有0個或多個引數

        @Inject MethodModirers ResultType Identifier(FormalParameterList ) Throws MethodBody

    [上述翻譯:inject的doc文件,翻譯不好敬請諒解]

    建構函式註解:

  1. @Inject
  2. public House(Person owner) {  
  3.     System.out.println("---這是房屋建構函式---");  
  4.     this.owner = owner;  
  5. }  
    欄位註解:
  1. @Injectprivate Person owner;  
    方法註解:
  1. @Inject
  2. publicvoid setOwner(Person owner) {  
  3.     this.owner = owner;  
  4. }  
    @Inject註解和Spring的@Autoware註解都是根據型別對其進行自動裝配。

    SpringUtil類:

  1. publicclass SpringUtil {  
  2.     privatestatic ApplicationContext context = null;  
  3.     publicstatic ApplicationContext getApplicationContext() {  
  4.         if (context == null) {  
  5.             context = new ClassPathXmlApplicationContext("spring.xml");  
  6.         }  
  7.         return context;  
  8.     }  
  9.     publicstatic ApplicationContext getApplicationContext(String path) {  
  10.         returnnew ClassPathXmlApplicationContext(path);  
  11.     }  
  12.     publicstatic ApplicationContext getAnnotationConfigApplicationContext(String basePackages) {  
  13.         returnnew AnnotationConfigApplicationContext(basePackages);  
  14.     }  
  15. }  
Person類:
  1. import javax.inject.Named;  
  2. @Named
  3. publicclass Person {  
  4.     private String name;  
  5.     public Person() {  
  6.         System.out.println("---這是人的建構函式---");  
  7.     }  
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.     publicvoid setName(String name) {