淺談Spring框架中@Autowired和@Resource的區(qū)別
前言
寫過Spring框架的同學應該都知道,Spring當中使用字段注入的時候既可以用 @Autowired 又可以用 @Resource,但是當我使用 @Autowired,idea會提示我說,不建議使用字段注入:

但如果我用的是 @Resource,就不會有這樣的提示:

于是在好奇心的驅使下,我探究了一下他們兩者的區(qū)別,并了解了為什么idea會對 @Autowired 發(fā)出弱警告,在這里分享給大家。
默認注入方式不同
@Autowired默認的注入方式為byType(根據類型進行匹配),也就是說會優(yōu)先根據接口類型去匹配并注入 Bean (接口的實現類),如果想要指定名稱,可以通過@Qualifier配合使用。@Autowired private UserSafetyMapper userSafetyMapper; // 或 @Autowired @Qualifier("userSafetyMapper") private UserSafetyMapper userSafetyMapper;@Resource默認注入方式為 byName(根據命名進行匹配)。如果無法通過名稱匹配到對應的實現類的話,注入方式會變?yōu)閎yType。- 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常;
- 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常;
- 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常;
- 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配。
// 1.默認注入方式 @Resource private UserSafetyMapper userSafetyMapper; // 2.指定注入方式 @Resource(name = "userSafetyMapper", type = UserSafetyMapper.class) private UserSafetyMapper userSafetyMapper;
提供者不同
@Autowired 是spring提供的注解,@Resource 是JDK提供的注解。其實這也是為什么idea會對 @Autowired 發(fā)出警告,而不會對@Resource發(fā)出警告的原因。
根據我查閱的一些資源和一點個人理解,得出以下分析:
@Autowired 是Spring提供的,它只能適用于Spring,是特定IOC提供的特定注解,這就導致了程序和框架的強耦合,一旦換用了其他的IOC框架,就會導致失效,無法支持注入。而 @Resource 是Java提供的一種標準,一般的IOC容器應該去主動對 @Resource 做兼容,這樣我們即使換了其他的框架,也可以正常使用字段注入的功能。
不過話又說回來,我們在搭建一個項目的時候,剛開始選好框架了,以后很大可能就不會再去更換為其他的框架了,即使字段注入松耦合了,但其實還有其他更多的東西需要去修改,所以我個人認為用這兩個都可以,具體使用哪個還得看公司的編碼規(guī)范,個人項目的話,統一使用一個就好了。
補充:@Resource的裝配順序如下
如果同時指定了name和type,流程如下:

如果指定了name,流程如下:
只是指定了@Resource注解的name,則按name后的名字去bean元素里查找有與之相等的name屬性的bean。

如果指定了type,流程如下:
只指定@Resource注解的type屬性,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常。

如果既沒有指定name,也沒有指定type,流程如下:
既不指定name屬性,也不指定type屬性,則自動按byName方式進行查找。如果沒有找到符合的bean,則回退為一個原始類型進行進行查找,如果找到就注入。

總結
到此這篇關于Spring框架中@Autowired和@Resource區(qū)別的文章就介紹到這了,更多相關Spring @Autowired和@Resource區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Spring中@Autowired @Resource @Inject三個注解有什么區(qū)別
- 一文搞懂Spring中@Autowired和@Resource的區(qū)別
- Spring@Autowired與@Resource的區(qū)別有哪些
- Spring中@Autowired與@Resource的區(qū)別詳析
- Spring注解@Resource和@Autowired區(qū)別對比詳解
- 詳解Spring注解--@Autowired、@Resource和@Service
- Spring框架中 @Autowired 和 @Resource 注解的區(qū)別
- 深入了解Spring中的@Autowired和@Resource注解
相關文章
redis scan命令導致redis連接耗盡,線程上鎖的解決
這篇文章主要介紹了redis scan命令導致redis連接耗盡,線程上鎖的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
詳解Java中Dijkstra(迪杰斯特拉)算法的圖解與實現
Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計算一個節(jié)點到其他所有節(jié)點的最短路徑。本文將詳解該算法的圖解與實現,需要的可以參考一下2022-05-05
SpringMVC中redirect重定向(帶參數)的3種方式
Spring MVC中做form表單功能提交時,防止用戶客戶端后退或者刷新時重復提交問題,需要在服務端進行重定向跳轉,本文主要介紹了SpringMVC中redirect重定向(帶參數)的3種方式,感興趣的可以了解一下2024-07-07
Mapstruct?@Mapper?@Mapping?使用小結
這篇文章主要介紹了Mapstruct?@Mapper?@Mapping使用小結,他們用于各個對象實體間的相互轉換,例如數據庫底層實體轉為頁面對象,Model?轉為?DTO,?DTO?轉為其他中間對象,?VO?等等,相關轉換代碼為編譯時自動產生的新文件和代碼,需要的朋友可以參考下2023-09-09
Spring Boot集成springfox-swagger2構建restful API的方法教程
這篇文章主要給大家介紹了關于Spring Boot集成springfox-swagger2構建restful API的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。2017-06-06

