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

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

這個是 Java EE 6 規範 JSR 330 -- Dependency Injection for Java 中的東西,也就是 Java EE 的依賴注入。

根據 API document 上的說明,被 @Inject 標註的構造、成員欄位和方法是可注入的。

其包可以在 jcp.org 上找到,並可以在這裡下載:

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_JCP-Site/en_US/-/USD/ViewProductD[email protected]

CDS-CDS_JCP



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.   
  3. import com.kaishengit.service.ProjectService;  
  4. import org.springframework.beans.factory.annotation.Autowired;  
  5. import org.springframework.stereotype.Controller;  
  6.   
  7. @Controller  
  8. public class FolderController {  
  9.     private ProjectService projectService;  
  10.   
  11.     //set  
  12.     @Autowired  
  13.     public void setProjectService(ProjectService projectService) {  
  14.         this.projectService = projectService;  
  15.     }  
  16. }  

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

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

 javax.inject.jar下載地址:https://code.google.com/p/dependency-shot/downloads/detail?name=javax.inject.jar&can=2&q=


@Inject

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

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

    在欄位註解:

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

    在方法上註解:

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

        @Inject MethodModirers ResultType Identifier(FormalParameterList ) Throws MethodBody

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

    建構函式註解:

 

[java]  view plain copy  
  1. @Inject  
  2. public House(Person owner) {  
  3.     System.out.println("---這是房屋建構函式---");  
  4.     this.owner = owner;  
  5. }  
    欄位註解:

 

 

[java]  view plain copy  
  1. @Inject private Person owner;  
    方法註解:

 

 

[java]  view plain copy  
  1. @Inject  
  2. public void setOwner(Person owner) {  
  3.     this.owner = owner;  
  4. }  
    @Inject註解和Spring的@Autoware註解都是根據型別對其進行自動裝配。

 

    SpringUtil類:

 

[java]  view plain copy  
  1. public class SpringUtil {  
  2.     private static ApplicationContext context = null;  
  3.     public static ApplicationContext getApplicationContext() {  
  4.         if (context == null) {  
  5.             context = new ClassPathXmlApplicationContext("spring.xml");  
  6.         }  
  7.         return context;  
  8.     }  
  9.   
  10.     public static ApplicationContext getApplicationContext(String path) {  
  11.         return new ClassPathXmlApplicationContext(path);  
  12.     }  
  13.   
  14.     public static ApplicationContext getAnnotationConfigApplicationContext(String basePackages) {  
  15.         return new AnnotationConfigApplicationContext(basePackages);  
  16.     }  
  17. }  
Person類:

 

 

[java]  view plain copy  
  1. import javax.inject.Named;  
  2.   
  3. @Named  
  4. public class Person {  
  5.     private String name;  
  6.   
  7.     public Person() {  
  8.         System.out.println("---這是人的建構函式---");  
  9.     }  
  10.   
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18. }  
House類:

 

 

[java]  view plain copy  
  1. @Named  
  2. public class House {  
  3.     @Inject private Person owner;  
  4.     public House() {  
  5.         System.out.println("---這是房屋建構函式---");  
  6.     }  
  7.   
  8.     public Person getOwner() {  
  9.         return owner;  
  10.     }  
  11.   
  12.     public void setOwner(Person owner) {  
  13.         this.owner = owner;  
  14.     }  
  15. }  
測試類:

 

 

[java]  view plain copy  
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         ApplicationContext context = SpringUtil.getApplicationContext(  
  4.                 "test/spring/inject/bean-inject.xml");  
  5.         House house = (House)context.getBean("house");  
  6.         Person p = house.getOwner();  
  7.         p.setName("張三");  
  8.         System.out.println(house.getOwner().getName());  
  9.     }  
  10. }  
輸出結果:

 

---這是房屋建構函式---
---這是人的建構函式---
張三

    上述例子在Spring3.1下測試成功,在Spring3.1下,每個建構函式只初始化一次及預設的單例形式,個人感覺如果脫離Spring環境應該每次用都會例項化新的物件,當然根據實現的jar包不同而不同,要不javax.inject下的@Singleton註解就沒有什麼用途了。

@Named

    @Named和Spring的@Component功能相同。@Named可以有值,如果沒有值生成的Bean名稱預設和類名相同。

    例如:

[java]  view plain copy  
  1. @Named public class Person  
    該bean的名稱就是person。

 

 

[java]  view plain copy  
  1. @Named("p"public class Person  
    如果指定名稱,那麼就是指定的名稱嘍。

 

@Qualifier

    任何人都可以定義一個新的修飾語,一個qualifier註解應該滿足如下條件:

  • 定義的註解類有@Qualifier,@Retention(RUNTIME)和@Documented。
  • 可以有屬性
  • 可以是公共API的一部分
  • 可以用@Target註解限定使用範圍

    下面是Qualifier的例子:

Genre註解類:

 

[java]  view plain copy  
  1. @Documented  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. @Qualifier  
  4. @Target(value = {ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})  
  5. public @interface Genre {  
  6.     User user() default User.STUDENT;  
  7.     public enum User {STUDENT, TEACHER}  
  8. }  
使用者介面:(對個數進行統計)

 

 

[java]  view plain copy  
  1. public interface IUserDAO {  
  2.     int count();  
  3. }  
StudentDAO:

 

 

[java]  view plain copy  
  1. @Named  
  2. 相關推薦

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

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

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

    這個是 Java EE 6 規範 JSR 330 -- Dependency Injection for Java 中的東西,也就是 Java EE 的

    依賴注入 javax.inject@Inject、@Named、@Qualifier@Provider用法

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

    關於在spring依賴注入的類使用測試類解決辦法

    剛接觸專案的實習生,積累經驗,歡迎交流 今天在專案中,遇到了一個問題:在一個spring管理的類中,使用junit測試類,總會報一個非法引數異常, 之後查詢了資料後終於找到了解決辦法,博主寫的十分詳細,資料:部落格連結 我就拾人牙慧,直接上解決辦法了: 先寫一個BaseSp

    Ninject依賴注入——建構函式、屬性、方法欄位的注入(三)

    1、Ninject簡介   Ninject是基於.Net平臺的依賴注入框架,它能夠將應用程式分離成一個個高內聚、低耦合(loosely-coupled, highly-cohesive)的模組,然後以一種靈活的方式組織起來。Ninject可以使程式碼變得更容易編寫、重用

    CSSposition的absoluterelative用法

    spa 層疊 src img 正常 static 窗口 info str static: HTML元素的默認定位方式 absolute: 將對象從文檔流中拖出,使用left,right,top,bottom等屬性進行絕對定位。而其層疊通過z-index屬性定義。絕對

    pythonlist的countindex用法舉例

    >>> str = [1,2,3,4,5] #定義一個列表 >>> str *= 3 #列表*3 >>> str [1, 2,

    jQuerywrap、wrapAllwrapInner用法以及區別

    wrap、wrapAll和wrapInner都是包裹節點,但是在使用的時候總是容易混淆,不太明白具體的區別。簡單的來說;wrap(): 將所有匹配元素單獨包裹起來wrapAll(): 將所有匹配元素一

    內容包裝:jQuerywrap、wrapAllwrapInner用法以及區別

    wrap,   使用函式來規定在每個被選元素周圍包裹的內容。 <ul>   <li title='蘋果'>蘋果</li>   <li title='橘子'>橘子</li>   <li title='菠

    sql的group by having 用法解析(張高偉)

    --sql中的group by 用法解析: -- Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。 --它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。 --注意:group by 是先排序後分組; --舉例子說明:

    javax.inject.jar:依賴注入非常方便的jar包

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

    Vue依賴注入 provide inject

    允許一個祖先元件向其所有子孫後代注入一個依賴,不論元件層次有多深,並在起上下游關係成立的時間裡始終生效 provide 選項允許我們指定我們想要提供給後代元件的資料/方法 provide 選項應該是一個物件或返回一個物件的函式  provide

    Vue實戰指南之依賴注入(provide / inject

    案例 UI美眉說咱家的選項選單太醜了,小哥哥能不能美化一下呀,灑家自然是說小意思啦~ 自定義一個select元件,so easy~ 簡單粗暴型: <el-select v-model="favourite" :option="[]"></el-select> option作為資

    spring下應用@Resource, @Autowired @Inject註解進行依賴注入的差異

    為了探尋 ‘@Resource’, ‘@Autowired’, 和‘@Inject’如何解決依賴注入中的問題,我建立了一個“Party”介面,和它的兩個實現類“Person”,“Organization”。這樣我就可以在注入Bean的時候不必使用具體型別(指使用介面型別即可)。這樣做也方便我研究當一個介面有多

    Asp.net MVC如何實現依賴注入(DI)(二)

    昨天說了一下Castle與Autofac如何在MVC中的使用,今天再來簡單說一下Spring.Net框架在MVC中如何依賴注入的。 官網:http://www.springframework.net/ 專案結構圖:   首先,我們要在專案中新增Spring.Net的類庫引用,我們可以在N

    大話DI依賴注入+IOC控制反轉(二) 之 淺析.Net Core的DI與IOC

          在上一篇文章中,我們聊了很多關於定義的方面,比較孤燥,下面我們結合.Net Core聊一下依賴注入&控制反轉。   三種物件生命週期       關於.Net Core中的容

    ASP.NET Core使用GraphQL - 第三章 依賴注入

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 SOLID原則中的D表示依賴倒置原則。這個原則的內容是: 上層模組不應

    在Spring依賴注入的幾種方式實現鬆耦合

    一、普通注入方式: (1)在IDEA工作空間內先建立lib包然後匯入Spring的架包(複製進去的架包要按住滑鼠右鍵出現Add as Library)。 (2)在已經建立好架包的基礎上在src目錄下建立XML檔案,檔案命為applicationContext.xml,需要注意的是我們建

    angular js依賴注入是什麼?

    這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【angular js中的依賴注入是什麼? 】 【JS-7】  &n

    dotnet core在Task使用依賴注入的Service/EFContext

    C#:在Task中使用依賴注入的Service/EFContext dotnet core時代,依賴注入基本已經成為標配了,這就不多說了. 前幾天在做某個功能的時候遇到在Task中使用EF DbContext的問題,學藝不精的我被困擾了不短的一段時間, 於是有了這個文章. 先說一下程式碼結構和場景.