@Resource,@Autowired,@Inject3種注入方式詳解

茅坤寶駿氹發表於2018-05-04

轉載自 @Resource,@Autowired,@Inject3種注入方式詳解

 

 

概況

 

@Resource,@Autowired,@Inject 這3種都是用來注入bean的,它們屬於不同的程式中。

 

ANNOTATION PACKAGE SOURCE
@Resource javax.annotation Java JSR-250
@Inject javax.inject Java JSR-330
@Autowired org.springframework.bean.factory Spring 2.5+

 

JSR是Java Specification Requests的縮寫,意思是Java 規範提案。是指向JCP(Java Community Process)提出新增一個標準化技術規範的正式請求。任何人都可以提交JSR,以向Java平臺增添新的API和服務。JSR已成為Java界的一個重要標準。

 

區別

 

@Resource

 

它有兩個關鍵的屬性:name-名稱,type-型別

 

1、如果指定了name,type,則從Spring容器中找一個名稱和型別相當應的一個bean,找不到則報錯。

2、如果只指定了name,則從Spring容器中找一個名稱和name一樣的bean,找不到則報錯。

3、如果只指定了type,則從Spring容器中找一個型別和type一樣的bean,找不到或者找到多個則報錯。

4、如果沒有指定引數,則預設找欄位名稱裝配,找不到則按型別裝配,找不到則報錯。

 

@Autowired

 

預設按型別裝配,找不到或者找到多個則報錯。

 

如果要按名稱裝配,需要結合Spring另外一個註解Qualifier("name")使用。

 

預設必須裝配requred=true,如果可以為空,可以設定為false,在Spring4+結合jdk8+的情況下還可以使用Optional和false同等的效果,如

 

@Autowired

private Optional<UserService> userService;

 

 

@Inject

 

和@Autowired類似,可以完全代替@Autowired,但這個沒有required屬性,要求bean必須存在。

 

如果要按名稱裝配,需要結合javax另外一個註解N("name")使用。

 

 

相關文章