首頁 > 軟體

淺談Spring框架中@Autowired和@Resource的區別

2022-10-30 14:00:36

前言

寫過Spring框架的同學應該都知道,Spring當中使用欄位注入的時候既可以用 @Autowired 又可以用 @Resource,但是當我使用 @Autowired,idea會提示我說,不建議使用欄位注入:

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

於是在好奇心的驅使下,我探究了一下他們兩者的區別,並瞭解了為什麼idea會對 @Autowired 發出弱警告,在這裡分享給大家。

預設注入方式不同

  • @Autowired 預設的注入方式為byType(根據型別進行匹配),也就是說會優先根據介面型別去匹配並注入 Bean (介面的實現類),如果想要指定名稱,可以通過 @Qualifier 配合使用。

    @Autowired
    private UserSafetyMapper userSafetyMapper;
    
    // 或
    @Autowired @Qualifier("userSafetyMapper")
    private UserSafetyMapper userSafetyMapper;
  • @Resource 預設注入方式為 byName(根據命名進行匹配)。如果無法通過名稱匹配到對應的實現類的話,注入方式會變為byType。

    • 如果同時指定了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 發出警告,而不會對@Resource發出警告的原因。

根據我查閱的一些資源和一點個人理解,得出以下分析:

@Autowired 是Spring提供的,它只能適用於Spring,是特定IOC提供的特定註解,這就導致了程式和框架的強耦合,一旦換用了其他的IOC框架,就會導致失效,無法支援注入。而 @Resource 是Java提供的一種標準,一般的IOC容器應該去主動對 @Resource 做相容,這樣我們即使換了其他的框架,也可以正常使用欄位注入的功能。

不過話又說回來,我們在搭建一個專案的時候,剛開始選好框架了,以後很大可能就不會再去更換為其他的框架了,即使欄位注入鬆耦合了,但其實還有其他更多的東西需要去修改,所以我個人認為用這兩個都可以,具體使用哪個還得看公司的編碼規範,個人專案的話,統一使用一個就好了。

補充:@Resource的裝配順序如下

如果同時指定了name和type,流程如下:

如果指定了name,流程如下:

只是指定了@Resource註解的name,則按name後的名字去bean元素裡查詢有與之相等的name屬性的bean。

 如果指定了type,流程如下:

只指定@Resource註解的type屬性,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常。

如果既沒有指定name,也沒有指定type,流程如下:

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

總結

到此這篇關於Spring框架中@Autowired和@Resource區別的文章就介紹到這了,更多相關Spring @Autowired和@Resource區別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com