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

Spring和IDEA不推薦使用@Autowired?注解原因解析

 更新時間:2023年07月09日 14:09:27   作者:java版web項目  
這篇文章主要為大家介紹了Spring和IDEA不推薦使用@Autowired?注解原因解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

說明

Spring官方已不推薦使用Autowired字段/屬性注入bean,,一些大公司的新項目也明令禁止使用了。

最近公司升級框架,由原來的spring framerwork 3.0升級到5.0,然后寫代碼的時候突然發(fā)現(xiàn)idea在屬性注入的@Autowired注解上給出警告提示,就像下面這樣的,也挺懵逼的,畢竟這么寫也很多年了。

Field injection is not recommended

查閱了相關(guān)文檔了解了一下,原來這個提示是spring framerwork 4.0以后開始出現(xiàn)的,spring 4.0開始就不推薦使用屬性注入,改為推薦構(gòu)造器注入和setter注入。

下面將展示了spring框架可以使用的不同類型的依賴注入,以及每種依賴注入的適用情況。

依賴注入的類型

盡管針對spring framerwork 5.1.3的文檔只定義了兩種主要的依賴注入類型,但實際上有三種;

  • 基于構(gòu)造函數(shù)的依賴注入
  • 基于setter的依賴注入
  • 基于字段的依賴注入

其中基于字段的依賴注入被廣泛使用,但是idea或者其他靜態(tài)代碼分析工具會給出提示信息,不推薦使用。另外,搜索公眾號頂級算法后臺回復(fù)“算法”,獲取一份驚喜禮包。

甚至可以在一些Spring官方指南中看到這種注入方法:

在基于構(gòu)造函數(shù)的依賴注入中,類構(gòu)造函數(shù)被標(biāo)注為@Autowired,并包含了許多與要注入的對象相關(guān)的參數(shù)。

@Component
public?class?ConstructorBasedInjection?{
????private?final?InjectedBean?injectedBean;
????@Autowired????
????public?ConstructorBasedInjection(InjectedBean?injectedBean)?{
????????this.injectedBean?=?injectedBean;
????}
}

然后在spring官方文檔中,@Autowired注解也是可以省去的。

public?class?SimpleMovieLister?{
????//?the?SimpleMovieLister?has?a?dependency?on?a?MovieFinder????
????private?MovieFinder?movieFinder;
????//?a?constructor?so?that?the?Spring?container?can?inject?a?MovieFinder????
????public?SimpleMovieLister(MovieFinder?movieFinder)?{????????
????????this.movieFinder?=?movieFinder;????
????}
????//?business?logic?that?actually?uses?the?injected?MovieFinder?is?omitted...
}

基于構(gòu)造函數(shù)注入的主要優(yōu)點是可以將需要注入的字段聲明為final, 使得它們會在類實例化期間被初始化,這對于所需的依賴項很方便。

基于Setter的依賴注入

在基于setter的依賴注入中,setter方法被標(biāo)注為@Autowired。一旦使用無參數(shù)構(gòu)造函數(shù)或無參數(shù)靜態(tài)工廠方法實例化Bean,為了注入Bean的依賴項,Spring容器將調(diào)用這些setter方法。

@Component
public?class?SetterBasedInjection?{
????private?InjectedBean?injectedBean;
????@Autowired
????public?void?setInjectedBean(InjectedBean?injectedBean)?{
????????this.injectedBean?=?injectedBean;?
????}
}

和基于構(gòu)造器的依賴注入一樣,在官方文檔中,基于Setter的依賴注入中的@Autowired也可以省去。

public?class?SimpleMovieLister?{
????//?the?SimpleMovieLister?has?a?dependency?on?the?MovieFinder
????private?MovieFinder?movieFinder;
????//?a?setter?method?so?that?the?Spring?container?can?inject?a?MovieFinder
????public?void?setMovieFinder(MovieFinder?movieFinder)?{?????
????????this.movieFinder?=?movieFinder;
????}
????//?business?logic?that?actually?uses?the?injected?MovieFinder?is?omitted...
}

基于屬性的依賴注入

在基于屬性的依賴注入中,字段/屬性被標(biāo)注為@Autowired。一旦類被實例化,Spring容器將設(shè)置這些字段。

@Component
public?class?FieldBasedInjection?{????
????@Autowired????
????private?InjectedBean?injectedBean;
}

正如所看到的,這是依賴注入最干凈的方法,因為它避免了添加樣板代碼,并且不需要聲明類的構(gòu)造函數(shù)。代碼看起來很干凈簡潔,但是正如代碼檢查器已經(jīng)向我們暗示的那樣,這種方法有一些缺點。

基于字段的依賴注入缺陷

不允許聲明不可變域

基于字段的依賴注入在聲明為final/immutable的字段上不起作用,因為這些字段必須在類實例化時實例化。聲明不可變依賴項的唯一方法是使用基于構(gòu)造器的依賴注入。

容易違反單一職責(zé)設(shè)計原則

在面向?qū)ο蟮木幊讨校宕笤O(shè)計原則SOLID被廣泛應(yīng)用,(國內(nèi)一般為六大設(shè)計原則),用以提高代碼的重用性,可讀性,可靠性和可維護(hù)性

S在SOLID中代表單一職責(zé)原則,即即一個類應(yīng)該只負(fù)責(zé)一項職責(zé),這個類提供的所有服務(wù)都應(yīng)該只為它負(fù)責(zé)的職責(zé)服務(wù)。

使用基于字段的依賴注入,高頻使用的類隨著時間的推移,我們會在類中逐漸添加越來越多的依賴項,我們用著很爽,很容易忽略類中的依賴已經(jīng)太多了。但是如果使用基于構(gòu)造函數(shù)的依賴注入,隨著越來越多的依賴項被添加到類中,構(gòu)造函數(shù)會變得越來越大,我們一眼就可以察覺到哪里不對勁。

有一個有超過10個參數(shù)的構(gòu)造函數(shù)是一個明顯的信號,表明類已經(jīng)轉(zhuǎn)變一個大而全的功能合集,需要將類分割成更小、更容易維護(hù)的塊。

因此,盡管屬性注入并不是破壞單一責(zé)任原則的直接原因,但它隱藏了信號,使我們很容易忽略這些信號。

與依賴注入容器緊密耦合

使用基于字段的依賴注入的主要原因是為了避免getter和setter的樣板代碼或為類創(chuàng)建構(gòu)造函數(shù)。最后,這意味著設(shè)置這些字段的唯一方法是通過Spring容器實例化類并使用反射注入它們,否則字段將保持null。

依賴注入設(shè)計模式將類依賴項的創(chuàng)建與類本身分離開來,并將此責(zé)任轉(zhuǎn)移到類注入容器,從而允許程序設(shè)計解耦,并遵循單一職責(zé)和依賴項倒置原則(同樣可靠)。因此,通過自動裝配(autowiring)字段來實現(xiàn)的類的解耦,最終會因為再次與類注入容器(在本例中是Spring)耦合而丟失,從而使類在Spring容器之外變得無用。

這意味著,如果您想在應(yīng)用程序容器之外使用您的類,例如用于單元測試,您將被迫使用Spring容器來實例化您的類,因為沒有其他可能的方法(除了反射)來設(shè)置自動裝配字段。

隱藏依賴關(guān)系

在使用依賴注入時,受影響的類應(yīng)該使用公共接口清楚地公開這些依賴項,方法是在構(gòu)造函數(shù)中公開所需的依賴項,或者使用方法(setter)公開可選的依賴項。當(dāng)使用基于字段的依賴注入時,實質(zhì)上是將這些依賴對外隱藏了。

總結(jié)

我們已經(jīng)看到,基于字段的注入應(yīng)該盡可能地避免,因為它有許多缺點,無論它看起來多么優(yōu)雅。推薦的方法是使用基于構(gòu)造函數(shù)和基于setter的依賴注入。對于必需的依賴,建議使用基于構(gòu)造函數(shù)的注入,設(shè)置它們?yōu)椴豢勺兊?,并防止它們?yōu)閚ull。對于可選的依賴項,建議使用基于sett的注入。

參考文檔

Field injection is not recommended – Spring IOC by Marc Nuri

以上就是Spring和IDEA不推薦使用@Autowired 注解原因解析的詳細(xì)內(nèi)容,更多關(guān)于Spring IDEA不推薦@Autowired的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring在多線程下@Resource注入為null的問題

    Spring在多線程下@Resource注入為null的問題

    這篇文章主要介紹了Spring在多線程下@Resource注入為null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實戰(zhàn)之用springboot+netty實現(xiàn)簡單的一對一聊天

    Java實戰(zhàn)之用springboot+netty實現(xiàn)簡單的一對一聊天

    這篇文章主要介紹了Java實戰(zhàn)之用springboot+netty實現(xiàn)簡單的一對一聊天,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot中Redis序列化配置全過程

    SpringBoot中Redis序列化配置全過程

    這篇文章主要介紹了SpringBoot中Redis序列化配置全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • 在Java中創(chuàng)建對話框的最佳實戰(zhàn)指南

    在Java中創(chuàng)建對話框的最佳實戰(zhàn)指南

    對話框是用于向用戶顯示信息(如錯誤提示、輸入請求)的圖形組件,通常作為Java GUI應(yīng)用的頂級容器存在,本文給大家分享了在Java中創(chuàng)建對話框的最佳實戰(zhàn)指南,需要的朋友可以參考下
    2025-06-06
  • 實例分析Java Class的文件結(jié)構(gòu)

    實例分析Java Class的文件結(jié)構(gòu)

    今天把之前在Evernote中的筆記重新整理了一下,發(fā)上來供對java class 文件結(jié)構(gòu)的有興趣的同學(xué)參考一下
    2013-04-04
  • 詳解SpringBoot如何開啟異步編程

    詳解SpringBoot如何開啟異步編程

    本文主要介紹了詳解SpringBoot如何開啟異步編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 一文帶你深入了解Java的數(shù)據(jù)結(jié)構(gòu)

    一文帶你深入了解Java的數(shù)據(jù)結(jié)構(gòu)

    Java工具包提供了強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中常用的幾種接口和類,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • SpringBoot默認(rèn)配置的具體使用

    SpringBoot默認(rèn)配置的具體使用

    本文主要介紹了SpringBoot默認(rèn)配置的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • SpringBoot?LocalDateTime格式轉(zhuǎn)換方案詳解(前端入?yún)?

    SpringBoot?LocalDateTime格式轉(zhuǎn)換方案詳解(前端入?yún)?

    這篇文章主要介紹了SpringBoot?LocalDateTime格式轉(zhuǎn)換(前端入?yún)?,本文用示例介紹SpringBoot全局格式配置,將前端傳過來的時間自動轉(zhuǎn)化為LocalDateTime,需要的朋友可以參考下
    2023-04-04
  • Java連接數(shù)據(jù)庫JDBC技術(shù)之prepareStatement的詳細(xì)介紹

    Java連接數(shù)據(jù)庫JDBC技術(shù)之prepareStatement的詳細(xì)介紹

    這篇文章主要介紹了Java連接數(shù)據(jù)庫JDBC技術(shù)之prepareStatement的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論

塘沽区| 云和县| 成安县| 盐城市| 随州市| 改则县| 荥经县| 鸡东县| 当雄县| 调兵山市| 清流县| 改则县| 县级市| 都昌县| 华坪县| 曲麻莱县| 泗水县| 水富县| 永德县| 蒲城县| 安丘市| 石屏县| 长宁县| 和硕县| 德令哈市| 永春县| 安达市| 环江| 习水县| 碌曲县| 仲巴县| 光山县| 盐山县| 波密县| 洪湖市| 棋牌| 宁夏| 滨海县| 阳江市| 偏关县| 上饶市|