最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入分析@Resource和@Autowired注解區(qū)別

 更新時間:2023年04月18日 16:42:20   作者:Cosolar  
這篇文章主要為大家介紹了深入分析@Resource和@Autowired注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

@Resource和@Autowired都是Spring Framework中用于依賴注入的注解,但它們有幾點不同:

來源不同:@Resource注解來自于J2EE規(guī)范中;而@Autowired注解是Spring框架提供的。

搜索策略不同:@Resource注解默認(rèn)按照名稱進(jìn)行匹配查找,如果找不到,則按照類型進(jìn)行匹配。而@Autowired注解默認(rèn)是按照類型進(jìn)行匹配,如果出現(xiàn)多個類型一致的實例對象,則需要指定名稱。

屬性不同:@Resource注解沒有屬性名稱,只有一個name屬性,表示要注入的Bean名稱。而@Autowired注解有兩個重要屬性:required和name,其中required屬性表示是否必須注入該屬性,默認(rèn)為true;name屬性表示要注入的Bean名稱。

1、用法層面分析

首先,我們創(chuàng)建一個接口UserService和兩個實現(xiàn)類UserServiceImpl1UserServiceImpl2。

public interface UserService {
    void save();
}
@Service
public class UserServiceImpl1 implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl1 save");
    }
}
@Service
public class UserServiceImpl2 implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl2 save");
    }
}

然后,我們可以在需要使用UserService的地方進(jìn)行依賴注入。

使用@Resource注解:

@Component
public class UserController {
    @Resource
    private UserService userService;
    // ...
}

使用@Autowired注解:

@Component
public class UserController {
    @Autowired(required = false)
    @Qualifier("userServiceImpl1")
    private UserService userService;
    // ...
}

上面的代碼中,@Resource注解直接將UserService對象注入到userService屬性中,而@Autowired注解需要結(jié)合@Qualifier注解來指定具體的Bean名稱,并且通過required屬性設(shè)置是否必須注入該屬性。注意,@Autowired注解也可以省略@Qualifier注解,此時會按照類型進(jìn)行匹配查找對應(yīng)的Bean。

2、概念層面分析

再來分析一下其中的道道~~

Spring Framework中的依賴注入實現(xiàn)原理是基于Java反射機制和JavaBean規(guī)范的。

  • 通過反射機制實例化對象

Spring框架通過反射機制實例化需要注入的Bean對象,并將其存儲到一個Map中,其中Key為Bean名稱,Value為Bean實例對象。

  • 通過JavaBean規(guī)范完成Bean屬性注入

接下來,Spring會根據(jù)JavaBean規(guī)范(即屬性名以及該屬性的setter方法)查找需要注入的屬性,并通過反射機制調(diào)用對應(yīng)的setter方法進(jìn)行屬性注入。

  • 依賴注入的搜索策略

在依賴注入的過程中,Spring框架通常采用兩種搜索策略:

  • 按照類型搜索:當(dāng)需要注入的屬性的類型與容器中的多個Bean的類型一致時,會根據(jù)不同的注解選擇不同的搜索策略。比如使用@Autowired注解時,默認(rèn)按照類型匹配查找對應(yīng)的Bean。
  • 按照名稱搜索:當(dāng)需要注入的屬性的類型不唯一,或者需要注入的Bean名稱與屬性名稱不一致時,可以使用@Qualifier注解指定要注入的Bean名稱。
  • 使用各種注解進(jìn)行依賴注入

Spring框架提供了多種注解用于依賴注入,包括:

  • @Autowired:按照類型進(jìn)行注入;
  • @Resource:按照名稱進(jìn)行注入;
  • @Value:注入簡單類型或字符串類型的屬性;
  • @Inject:JSR-330標(biāo)準(zhǔn)定義的注解,功能與@Autowired類似。

Spring Framework的依賴注入實現(xiàn)原理是基于Java反射機制和JavaBean規(guī)范的,并通過多種注解實現(xiàn)不同的依賴注入方式。

@Resource和@Autowired都是Spring的依賴注入注解,但它們有如下區(qū)別:

  • 來源不同:@Resource是Java EE規(guī)范定義的注解,而@Autowired是Spring提供的注解。

  • 屬性不同:@Resource注解沒有required屬性,只有name屬性,表示要注入的Bean名稱;而@Autowired注解有required和name屬性,其中required表示是否必須注入該屬性,默認(rèn)為true;name表示要注入的Bean名稱。

  • 查找方式不同:@Resource注解默認(rèn)是根據(jù)byName的方式進(jìn)行查找,如果找不到則按照byType進(jìn)行查找;而@Autowired默認(rèn)是根據(jù)byType方式進(jìn)行查找。

  • 兼容性不同:@Resource注解可以與JSR-330的@Inject注解搭配使用;而@Autowired注解只能與Spring組件一起使用。

  • 應(yīng)用場景不同:@Resource注解主要應(yīng)用于Java EE環(huán)境,而@Autowired注解則是在Spring框架中使用最廣泛的依賴注入注解之一,可以適用于不同的應(yīng)用場景。

下面分別介紹@Resource和@Autowired注解的優(yōu)缺點:

@Resource優(yōu)點:

  • 簡單易用,在類中使用非常方便。

  • 可以和@Inject注解一起使用。

  • 支持指定Bean名稱,可以更精確地進(jìn)行依賴注入。

@Resource缺點:

  • Spring框架對@Resource注解的支持不如@Autowired豐富。

  • 僅支持byName和byType兩種注入方式,比@Autowired的支持更為有限。

@Autowired優(yōu)點:

  • 支持復(fù)雜的依賴注入配置,可以通過多種方式進(jìn)行依賴注入。

  • Spring框架對@Autowired注解的支持非常豐富,是Spring中使用最廣泛的注解之一。

  • 可以指定是否必須注入該屬性,也可以指定Bean名稱進(jìn)行注入。

  • 除了在類中使用之外,還可以在構(gòu)造方法、Setter方法及任何標(biāo)記了@Bean的方法中使用@Autowired注解。

@Autowired缺點:

  • 配置較為繁瑣,需要指定required和name屬性等。

  • 需要遵循Spring的自動掃描機制,只有標(biāo)記了@Component、@Service、@Controller和@Repository等注解的類才會被Spring容器進(jìn)行管理。

對于依賴注入的原理,可以簡單地概括為以下三個步驟:

  • 在應(yīng)用程序啟動時,Spring容器負(fù)責(zé)創(chuàng)建和管理所有的Bean實例對象。

  • 在需要使用某個Bean的時候,Spring容器會通過反射機制將該Bean注入到需要使用的類或?qū)ο笾小?/p>

  • 在Bean注入的過程中,Spring容器會根據(jù)不同的注解(如@Resource、@Autowired)采用不同的依賴注入方式,完成依賴注入的過程。

@Resouce和@Autowired都是Spring提供的依賴注入注解,各有優(yōu)缺點。在實際開發(fā)中,可以根據(jù)具體的應(yīng)用場景選擇合適的注解進(jìn)行使用。

3、源碼層面分析

在Spring Framework源碼層面,@Resource和@Autowired注解的實現(xiàn)類分別為javax.annotation.Resource和org.springframework.beans.factory.annotation.Autowired。下面我們來看一下它們的具體實現(xiàn)。

@Resource注解的實現(xiàn)原理:

  • 如果@Resource注解的name屬性不為空,則Spring容器根據(jù)該屬性值查找需要注入的Bean實例對象;如果name屬性為空,則默認(rèn)使用字段名作為Bean名稱進(jìn)行查找。
  • Spring容器會先根據(jù)byName注入方式進(jìn)行查找,如果沒有找到對應(yīng)的Bean實例,則根據(jù)byType方式進(jìn)行查找。
  • 如果找到了對應(yīng)的Bean實例,則使用反射機制將該Bean實例注入到需要使用該實例的類或?qū)ο笾小?/li>
  • 如果沒有找到對應(yīng)的Bean實例,則拋出NoSuchBeanDefinitionException異常。

代碼示例:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
    String name() default "";
    Class<?> type() default java.lang.Object.class;
    boolean shareable() default true;
}

@Autowired注解的實現(xiàn)原理:

  • Spring容器會根據(jù)AutowiredAnnotationBeanPostProcessor類和AutowiredAnnotationBeanPostProcessor類的派生類進(jìn)行處理,將使用@Autowired注解標(biāo)記的所有屬性注入到需要使用的類或?qū)ο笾小?/li>
  • 對于AutowiredAnnotationBeanPostProcessor,其實現(xiàn)了BeanPostProcessor接口,在Bean實例化、初始化的過程中會攔截@Autowired注解。
  • 當(dāng)Spring容器遇到@Autowired注解時,會自動調(diào)用AutowiredAnnotationBeanPostProcessor類的postProcessPropertyValues方法,該方法會根據(jù)不同的注解屬性值進(jìn)行不同的依賴注入處理。
  • 在處理@Autowired注解時,Spring容器默認(rèn)使用byType的方式進(jìn)行查找,如果存在多個匹配類型的Bean,則根據(jù)類名進(jìn)行匹配;如果仍然無法確定注入哪個Bean,則拋出NoSuchBeanDefinitionException異常。

代碼示例:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
    String value() default "";
}

無論是@Resource注解還是@Autowired注解,在Spring Framework源碼實現(xiàn)上都是通過反射機制和BeanPostProcessor接口完成依賴注入的。在實際開發(fā)中,我們可以研究對應(yīng)的源碼實現(xiàn),深入了解它們的原理,從而更好地使用這些依賴注入注解。

以上就是深入分析@Resource和@Autowired注解區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于@Resource @Autowired注解區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)與算法之樹(動力節(jié)點java學(xué)院整理)

    Java數(shù)據(jù)結(jié)構(gòu)與算法之樹(動力節(jié)點java學(xué)院整理)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之樹的相關(guān)知識,最主要的是二叉樹中的二叉搜索樹,需要的朋友可以參考下
    2017-04-04
  • Swift洗牌動畫效果的實現(xiàn)方法

    Swift洗牌動畫效果的實現(xiàn)方法

    這篇文章主要介紹了Swift洗牌動畫效果的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2016-12-12
  • 詳解springboot設(shè)置cors跨域請求的兩種方式

    詳解springboot設(shè)置cors跨域請求的兩種方式

    這篇文章主要介紹了詳解springboot設(shè)置cors跨域請求的兩種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java圖像處理之獲取用戶感興趣的區(qū)域

    Java圖像處理之獲取用戶感興趣的區(qū)域

    OpenCV(Open?Source?Computer?Vision?Library)是一個開源的計算機視覺庫,它提供了很多函數(shù),這些函數(shù)非常高效地實現(xiàn)了計算機視覺算法。本文將利用OpenCV實現(xiàn)獲取用戶感興趣的區(qū)域,從而達(dá)到摳圖效果
    2022-07-07
  • Java精品項目瑞吉外賣之員工信息管理篇

    Java精品項目瑞吉外賣之員工信息管理篇

    這篇文章主要為大家詳細(xì)介紹了java精品項目-瑞吉外賣訂餐系統(tǒng),此項目過大,分為多章獨立講解,本篇內(nèi)容為員工信息分頁查詢與啟用或禁用員工狀態(tài),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法

    SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java 實戰(zhàn)項目錘煉之IT設(shè)備固定資產(chǎn)管理系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)項目錘煉之IT設(shè)備固定資產(chǎn)管理系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+SSM+jsp+mysql+maven實現(xiàn)一個IT設(shè)備固定資產(chǎn)管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • Java集合類中文介紹

    Java集合類中文介紹

    本文首先對Java集合類框架做了簡單說明,之后對主要類和為API做了介紹:Collection、List、Set、AbstractCollection、AbstractList、AbstractSet、Iterator、ListIterator。
    2013-11-11
  • 解決JMap抓取heap使用統(tǒng)計信息報錯的問題

    解決JMap抓取heap使用統(tǒng)計信息報錯的問題

    這篇文章主要介紹了解決JMap抓取heap使用統(tǒng)計信息報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • RocketMQ事務(wù)消息機制詳解

    RocketMQ事務(wù)消息機制詳解

    這篇文章主要介紹了RocketMQ事務(wù)消息機制詳解,RocketMQ服務(wù)端將消息持久化之后,向發(fā)送方返回Ack確認(rèn)消息已經(jīng)發(fā)送成功,由于消息為半事務(wù)消息,在未收到生產(chǎn)者對該消息的二次確認(rèn)前,此消息被標(biāo)記成"暫不能投遞"狀態(tài),需要的朋友可以參考下
    2024-01-01

最新評論

灌阳县| 永仁县| 米脂县| 武隆县| 泽库县| 武邑县| 湖南省| 陵水| 德江县| 中西区| 玛曲县| 太原市| 万山特区| 宿州市| 茂名市| 广安市| 鄄城县| 汝南县| 洛阳市| 邹城市| 大渡口区| 云安县| 大竹县| 定襄县| 清远市| 浮山县| 京山县| 漳浦县| 县级市| 邳州市| 兴和县| 邻水| 航空| 鲜城| 眉山市| 阿城市| 台江县| 垣曲县| 定陶县| 罗定市| 托里县|