標簽@Resource @Autowired 和@Inject的區別

一些spring的開發人員在使用這三個標簽進行注入的時候感到困惑。我來嘗試解釋一下這三個注解的主要區別。事實上,這三者非常相似,只存在一些微小的差別。在稍后的文章中會進行解釋。

@Resource-在javax.annotation包中定義

@Inject-在javax.inject包中定義

@Autowired-在org.springframework.bean.factory包中定義

我們創建一個Car接口和兩個實現類Volkswagen和Toyota.分別通過三種標簽來注入來觀察差異. 接口和類的定義如下.這里只提供了代碼片段,如果你想運行這個例子,需要新建一個spring項目.

//Car.javapackagejavabeat.net.basic;publicinterfaceCar{}//Volkswagen.javapackagejavabeat.net.basic;importorg.springframework.stereotype.Component;@ComponentpublicclassVolkswagenimplementsCar{}//Toyota.javapackagejavabeat.net.basic;importorg.springframework.stereotype.Component;@ComponentpublicclassToyotaimplementsCar{}

Inject Interface

@ResourceprivateCar car;@AutowiredprivateCar car;@InjectprivateCar car;

下面是拋出的異常:

Resource注解拋出:org.springframework.beans.factory.NoSuchBeanDefinitionException:

Autowired注解拋出:No unique bean of type [javabeat.net.basics.Car] is defined:

Inject注解拋出:expected single matching bean but found 2: [volkswagen, toyota]

Field Type

@ResourceprivateVolkswagen car;@AutowiredprivateVolkswagen car;@InjectprivateVolkswagen car;

上面的代碼工作的很好。 通過bean type,三個注解都注入了Volkswagen.

Qualifier name

@Resource@Qualifier("volkswagen")privateCar car;@Autowired@Qualifier("volkswagen")privateCar car;@Inject@Qualifier("volkswagen")privateCar car;

上面三個注解結合了@Qualifier將Volkswagen成功注入了。

Conflicting Information

@Resource@Qualifier("nkl")privateCar volkswagen;@Autowired@Qualifier("nkl")privateCar volkswagen;@Inject@Qualifier("nkl")privateCar volkswagen;

上面的代碼,只有@Resource注入了Volkswagen類型.但是,@Autowired和@Injects都拋出了異常.

Resource注解拋出:org.springframework.beans.factory.NoSuchBeanDefinitionException:

Autowired注解拋出:No matching bean of type [javabeat.net.basics.Car] found for dependency:

所以主要的區別是:@Autowired和@Inject無區別,這兩個注解都是通過AutowiredAnnotationBeanPostProcessor來注入依賴。但是@Resource使用CommonAnnotationBeanPostProcessor來注入依賴。主要的區別是在檢查的順序上。

@Autowired and @Inject

1.Matches by Type

2.Restricts by Qualifiers

3.Matches by Name

@Resource

1.Matches by Name

2.Matches by Type

3.Restricts by Qualifiers (ignored if match is found by name)

原文地址 https://segmentfault.com/a/1190000010925583

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容