依賴注入 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]
用過Spring框架的我們都知道,每當生成依賴注入的時候,我們都必須生成相應類的set方法,而且要在set方法上面寫上@Autowired,才能實現依賴注入,如下:
Java程式碼- package com.kaishengit.web;
- import com.kaishengit.service.ProjectService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- @Controller
- public class FolderController {
- private ProjectService projectService;
- //set
- @Autowired
- public void setProjectService(ProjectService projectService) {
- this.projectService = projectService;
- }
- }
每次都要生成相應的set方法感覺好麻煩,現在如果我們使用javax.inject.jar,只需要在相應類的屬性上面加上@Inject,如下程式碼:
Java程式碼- package com.kaishengit.web;
- import com.kaishengit.service.ProjectService;
- import org.springframework.stereotype.Controller;
- import javax.inject.Inject;
- @Controller
- public class FolderController {
- @Inject
- private ProjectService projectService;
- }
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
- @Inject
- public House(Person owner) {
- System.out.println("---這是房屋建構函式---");
- this.owner = owner;
- }
[java] view plain copy
- @Inject private Person owner;
[java] view plain copy
- @Inject
- public void setOwner(Person owner) {
- this.owner = owner;
- }
SpringUtil類:
[java] view plain copy
- public class SpringUtil {
- private static ApplicationContext context = null;
- public static ApplicationContext getApplicationContext() {
- if (context == null) {
- context = new ClassPathXmlApplicationContext("spring.xml");
- }
- return context;
- }
- public static ApplicationContext getApplicationContext(String path) {
- return new ClassPathXmlApplicationContext(path);
- }
- public static ApplicationContext getAnnotationConfigApplicationContext(String basePackages) {
- return new AnnotationConfigApplicationContext(basePackages);
- }
- }
[java] view plain copy
- import javax.inject.Named;
- @Named
- public class Person {
- private String name;
- public Person() {
- System.out.println("---這是人的建構函式---");
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
[java] view plain copy
- @Named
- public class House {
- @Inject private Person owner;
- public House() {
- System.out.println("---這是房屋建構函式---");
- }
- public Person getOwner() {
- return owner;
- }
- public void setOwner(Person owner) {
- this.owner = owner;
- }
- }
[java] view plain copy
- public class Test {
- public static void main(String[] args) {
- ApplicationContext context = SpringUtil.getApplicationContext(
- "test/spring/inject/bean-inject.xml");
- House house = (House)context.getBean("house");
- Person p = house.getOwner();
- p.setName("張三");
- System.out.println(house.getOwner().getName());
- }
- }
---這是房屋建構函式---
---這是人的建構函式---
張三
上述例子在Spring3.1下測試成功,在Spring3.1下,每個建構函式只初始化一次及預設的單例形式,個人感覺如果脫離Spring環境應該每次用都會例項化新的物件,當然根據實現的jar包不同而不同,要不javax.inject下的@Singleton註解就沒有什麼用途了。
@Named
@Named和Spring的@Component功能相同。@Named可以有值,如果沒有值生成的Bean名稱預設和類名相同。
例如:
[java] view plain copy- @Named public class Person
[java] view plain copy
- @Named("p") public class Person
@Qualifier
任何人都可以定義一個新的修飾語,一個qualifier註解應該滿足如下條件:
- 定義的註解類有@Qualifier,@Retention(RUNTIME)和@Documented。
- 可以有屬性
- 可以是公共API的一部分
- 可以用@Target註解限定使用範圍
下面是Qualifier的例子:
Genre註解類:
[java] view plain copy
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier
- @Target(value = {ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
- public @interface Genre {
- User user() default User.STUDENT;
- public enum User {STUDENT, TEACHER}
- }
[java] view plain copy
- public interface IUserDAO {
- int count();
- }
[java] view plain copy
- @Named
-
相關推薦
依賴注入 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可以使程式碼變得更容易編寫、重用
CSS中position的absolute和relative用法
spa 層疊 src img 正常 static 窗口 info str static: HTML元素的默認定位方式 absolute: 將對象從文檔流中拖出,使用left,right,top,bottom等屬性進行絕對定位。而其層疊通過z-index屬性定義。絕對
python中list的count和index用法舉例
>>> str = [1,2,3,4,5] #定義一個列表 >>> str *= 3 #列表*3 >>> str [1, 2,
jQuery中wrap、wrapAll和wrapInner用法以及區別
wrap、wrapAll和wrapInner都是包裹節點,但是在使用的時候總是容易混淆,不太明白具體的區別。簡單的來說;wrap(): 將所有匹配元素單獨包裹起來wrapAll(): 將所有匹配元素一
內容包裝:jQuery中wrap、wrapAll和wrapInner用法以及區別
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的問題,學藝不精的我被困擾了不短的一段時間, 於是有了這個文章. 先說一下程式碼結構和場景.