一些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