欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Spring框架中@Autowired和@Resource的區(qū)別

 更新時(shí)間:2022年10月29日 08:50:01   作者:阿桿  
最近review別人代碼的時(shí)候,看到了一些@Autowired不一樣的用法,覺得有些意思,下面這篇文章主要給大家介紹了關(guān)于Spring框架中@Autowired和@Resource區(qū)別的相關(guān)資料,需要的朋友可以參考下

前言

寫過Spring框架的同學(xué)應(yīng)該都知道,Spring當(dāng)中使用字段注入的時(shí)候既可以用 @Autowired 又可以用 @Resource,但是當(dāng)我使用 @Autowired,idea會(huì)提示我說,不建議使用字段注入:

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

于是在好奇心的驅(qū)使下,我探究了一下他們兩者的區(qū)別,并了解了為什么idea會(huì)對(duì) @Autowired 發(fā)出弱警告,在這里分享給大家。

默認(rèn)注入方式不同

  • @Autowired 默認(rèn)的注入方式為byType(根據(jù)類型進(jìn)行匹配),也就是說會(huì)優(yōu)先根據(jù)接口類型去匹配并注入 Bean (接口的實(shí)現(xiàn)類),如果想要指定名稱,可以通過 @Qualifier 配合使用。

    @Autowired
    private UserSafetyMapper userSafetyMapper;
    
    // 或
    @Autowired @Qualifier("userSafetyMapper")
    private UserSafetyMapper userSafetyMapper;
  • @Resource 默認(rèn)注入方式為 byName(根據(jù)命名進(jìn)行匹配)。如果無法通過名稱匹配到對(duì)應(yīng)的實(shí)現(xiàn)類的話,注入方式會(huì)變?yōu)閎yType。

    • 如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常;
    • 如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常;
    • 如果指定了type,則從上下文中找到類型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個(gè),都會(huì)拋出異常;
    • 如果既沒有指定name,又沒有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒有匹配,則回退為一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配。
    // 1.默認(rèn)注入方式
    @Resource
    private UserSafetyMapper userSafetyMapper;
    
    // 2.指定注入方式
    @Resource(name = "userSafetyMapper", type = UserSafetyMapper.class)
    private UserSafetyMapper userSafetyMapper;

提供者不同

@Autowired 是spring提供的注解,@Resource 是JDK提供的注解。其實(shí)這也是為什么idea會(huì)對(duì) @Autowired 發(fā)出警告,而不會(huì)對(duì)@Resource發(fā)出警告的原因。

根據(jù)我查閱的一些資源和一點(diǎn)個(gè)人理解,得出以下分析:

@Autowired 是Spring提供的,它只能適用于Spring,是特定IOC提供的特定注解,這就導(dǎo)致了程序和框架的強(qiáng)耦合,一旦換用了其他的IOC框架,就會(huì)導(dǎo)致失效,無法支持注入。而 @Resource 是Java提供的一種標(biāo)準(zhǔn),一般的IOC容器應(yīng)該去主動(dòng)對(duì) @Resource 做兼容,這樣我們即使換了其他的框架,也可以正常使用字段注入的功能。

不過話又說回來,我們?cè)诖罱ㄒ粋€(gè)項(xiàng)目的時(shí)候,剛開始選好框架了,以后很大可能就不會(huì)再去更換為其他的框架了,即使字段注入松耦合了,但其實(shí)還有其他更多的東西需要去修改,所以我個(gè)人認(rèn)為用這兩個(gè)都可以,具體使用哪個(gè)還得看公司的編碼規(guī)范,個(gè)人項(xiàng)目的話,統(tǒng)一使用一個(gè)就好了。

補(bǔ)充:@Resource的裝配順序如下

如果同時(shí)指定了name和type,流程如下:

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

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

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

只指定@Resource注解的type屬性,則從上下文中找到類型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個(gè),都會(huì)拋出異常。

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

既不指定name屬性,也不指定type屬性,則自動(dòng)按byName方式進(jìn)行查找。如果沒有找到符合的bean,則回退為一個(gè)原始類型進(jìn)行進(jìn)行查找,如果找到就注入。

總結(jié)

到此這篇關(guān)于Spring框架中@Autowired和@Resource區(qū)別的文章就介紹到這了,更多相關(guān)Spring @Autowired和@Resource區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java+mysql實(shí)現(xiàn)商品搶購(gòu)功能

    java+mysql實(shí)現(xiàn)商品搶購(gòu)功能

    這篇文章主要為大家詳細(xì)介紹了java+mysql實(shí)現(xiàn)商品搶購(gòu)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java實(shí)現(xiàn)在線SQL編程最新完整版

    Java實(shí)現(xiàn)在線SQL編程最新完整版

    這篇文章主要介紹了Java實(shí)現(xiàn)在線SQL編程,在使用JDBC來進(jìn)行數(shù)據(jù)庫(kù)的操作,在使用時(shí)由于對(duì)其方法并不是全部了解,所以需要邊看源碼邊改善功能,感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • 解決@CachePut設(shè)置的key值無法與@CacheValue的值匹配問題

    解決@CachePut設(shè)置的key值無法與@CacheValue的值匹配問題

    這篇文章主要介紹了解決@CachePut設(shè)置的key的值無法與@CacheValue的值匹配問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringMvc接受請(qǐng)求參數(shù)的幾種情況演示

    SpringMvc接受請(qǐng)求參數(shù)的幾種情況演示

    Springmvc接受請(qǐng)求參數(shù)的幾種介紹,如何接受json請(qǐng)求參數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • Jmeter如何添加循環(huán)控制器

    Jmeter如何添加循環(huán)控制器

    這篇文章主要介紹了Jmeter如何添加循環(huán)控制器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)方法

    Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)方法

    這篇文章給大家分享了Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)單的實(shí)現(xiàn)方法,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-07-07
  • Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法

    Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷的方法

    服務(wù)熔斷是為了保護(hù)我們的服務(wù),比如當(dāng)某個(gè)服務(wù)出現(xiàn)問題的時(shí)候,控制打向它的流量,讓它有時(shí)間去恢復(fù),或者限制一段時(shí)間只能有固定數(shù)量的請(qǐng)求打向這個(gè)服務(wù),這篇文章主要介紹了Spring?Cloud?使用?Resilience4j?實(shí)現(xiàn)服務(wù)熔斷,需要的朋友可以參考下
    2022-12-12
  • Thread.sleep(0)的寫法原理深入解析

    Thread.sleep(0)的寫法原理深入解析

    這篇文章主要為大家介紹了Thread.sleep(0)的寫法原理深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • SpringBoot使用MyBatis-Flex實(shí)現(xiàn)靈活的數(shù)據(jù)庫(kù)訪問

    SpringBoot使用MyBatis-Flex實(shí)現(xiàn)靈活的數(shù)據(jù)庫(kù)訪問

    MyBatisFlex是一款優(yōu)秀的持久層框架,本文主要介紹了SpringBoot使用MyBatis-Flex實(shí)現(xiàn)靈活的數(shù)據(jù)庫(kù)訪問,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 使用JSONObject生成和解析json的方法

    使用JSONObject生成和解析json的方法

    下面小編就為大家?guī)硪黄褂肑SONObject生成和解析json的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論