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

為什么禁止在SpringBoot項(xiàng)目中使用@Autowired注解

 更新時(shí)間:2024年08月10日 08:56:47   作者:京東云開(kāi)發(fā)者  
寫(xiě)代碼的時(shí)候突然發(fā)現(xiàn)?idea?在屬性注入的?@Autowired?注解上給出警告提示,spring?framework?4.0?以后開(kāi)始出現(xiàn)的,spring?4.0?開(kāi)始就不推薦使用屬性注入,改為推薦構(gòu)造器注入和?setter?注入,推薦的方法是使用基于構(gòu)造函數(shù)和基于setter的依賴注入

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

說(shuō)明

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

Field injection is not recommended?

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

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

依賴注入的類型

盡管針對(duì) spring framework 5.1.3 的文檔只定義了兩種主要的依賴注入類型,但實(shí)際上有三種:

  • 基于構(gòu)造器的依賴注入
  • 基于 setter 的依賴注入
  • 基于字段的依賴注入

其中基于字段的依賴注入被廣泛使用,但是 idea 或者其他靜態(tài)代碼分析工具會(huì)給出提示信息,不推薦使用。

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

2.1 基于構(gòu)造器的依賴注入

在基于構(gòu)造函數(shù)的依賴注入中,類構(gòu)造函數(shù)被標(biāo)注為 @Autowired,并包含了許多與要注入的對(duì)象相關(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)點(diǎn)是可以將需要注入的字段聲明為 final, 使得它們會(huì)在類實(shí)例化期間被初始化,這對(duì)于所需的依賴項(xiàng)很方便。

2.2 基于 Setter 的依賴注入

在基于 setter 的依賴注入中,setter 方法被標(biāo)注為 @Autowired。一旦使用無(wú)參數(shù)構(gòu)造函數(shù)或無(wú)參數(shù)靜態(tài)工廠方法實(shí)例化 Bean,為了注入 Bean 的依賴項(xiàng),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...
}

2.3 基于屬性的依賴注入

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

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

正如所看到的,這是依賴注入最干凈的方法,因?yàn)樗苊饬颂砑訕影宕a,并且不需要聲明類的構(gòu)造函數(shù)。代碼看起來(lái)很干凈簡(jiǎn)潔,但是正如代碼檢查器已經(jīng)向我們暗示的那樣,這種方法有一些缺點(diǎn)。

基于字段的依賴注入缺陷

3.1 不允許聲明不可變域

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

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

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

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

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

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

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

3.3 與依賴注入容器緊密耦合

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

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

這意味著,如果您想在應(yīng)用程序容器之外使用您的類,例如用于單元測(cè)試,您將被迫使用 Spring 容器來(lái)實(shí)例化您的類,因?yàn)闆](méi)有其他可能的方法(除了反射)來(lái)設(shè)置自動(dòng)裝配字段。

3.4 隱藏依賴關(guān)系

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

總結(jié)

我們已經(jīng)看到,基于字段的注入應(yīng)該盡可能地避免,因?yàn)樗性S多缺點(diǎn),無(wú)論它看起來(lái)多么優(yōu)雅。推薦的方法是使用基于構(gòu)造函數(shù)和基于setter的依賴注入。對(duì)于必需的依賴,建議使用基于構(gòu)造函數(shù)的注入,設(shè)置它們?yōu)椴豢勺兊模⒎乐顾鼈優(yōu)?null。對(duì)于可選的依賴項(xiàng),建議使用基于 setter 的注入。

到此這篇關(guān)于為什么禁止在SpringBoot項(xiàng)目中使用@Autowired注解的文章就介紹到這了,更多相關(guān)禁止SpringBoot中使用@Autowired注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問(wèn)題

    如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問(wèn)題

    這篇文章主要介紹了如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 理解Java注解及Spring的@Autowired是如何實(shí)現(xiàn)的

    理解Java注解及Spring的@Autowired是如何實(shí)現(xiàn)的

    今天通過(guò)本文帶領(lǐng)大家學(xué)習(xí)注解的基礎(chǔ)知識(shí),學(xué)習(xí)Spring的@Autowired是怎么實(shí)現(xiàn)的,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • nacos注冊(cè)中心單節(jié)點(diǎn)ap架構(gòu)源碼解析(最新推薦)

    nacos注冊(cè)中心單節(jié)點(diǎn)ap架構(gòu)源碼解析(最新推薦)

    這篇文章主要介紹了nacos注冊(cè)中心單節(jié)點(diǎn)ap架構(gòu)源碼解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • spring boot中interceptor攔截器未生效的解決

    spring boot中interceptor攔截器未生效的解決

    這篇文章主要介紹了spring boot中interceptor攔截器未生效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 用JAVA實(shí)現(xiàn)一套背壓機(jī)制

    用JAVA實(shí)現(xiàn)一套背壓機(jī)制

    背壓依我的理解來(lái)說(shuō),是指訂閱者能和發(fā)布者交互,可以調(diào)節(jié)發(fā)布者發(fā)布數(shù)據(jù)的速率,解決把訂閱者壓垮的問(wèn)題,這篇文章主要介紹了用JAVA自己實(shí)現(xiàn)一套背壓機(jī)制,需要的朋友可以參考下
    2023-06-06
  • IntelliJ IDEA中properties文件顯示亂碼問(wèn)題的解決辦法

    IntelliJ IDEA中properties文件顯示亂碼問(wèn)題的解決辦法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中properties文件顯示亂碼問(wèn)題的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 深入了解java 8的函數(shù)式編程

    深入了解java 8的函數(shù)式編程

    函數(shù)式編程并不是Java新提出的概念,其與指令編程相比,強(qiáng)調(diào)函數(shù)的計(jì)算比指令的計(jì)算更重要;與過(guò)程化編程相比,其中函數(shù)的計(jì)算可以隨時(shí)調(diào)用。下面我們來(lái)詳細(xì)了解一下吧
    2019-06-06
  • Linux 下通過(guò) java 命令啟動(dòng) jar 包常見(jiàn)方式小結(jié)

    Linux 下通過(guò) java 命令啟動(dòng) jar 包常見(jiàn)方式小結(jié)

    這篇文章主要介紹了Linux 下通過(guò) java 命令啟動(dòng) jar 包常見(jiàn)方式小結(jié),后臺(tái)啟動(dòng)jar包命令大致有五種,每種方式結(jié)合代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • java實(shí)現(xiàn)基因序列比較的示例代碼

    java實(shí)現(xiàn)基因序列比較的示例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)基因序列比較的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java日期工具類時(shí)間校驗(yàn)實(shí)現(xiàn)

    Java日期工具類時(shí)間校驗(yàn)實(shí)現(xiàn)

    一般項(xiàng)目中需要對(duì)入?yún)⑦M(jìn)行校驗(yàn),比如必須是一個(gè)合法的日期,本文就來(lái)介紹一下Java日期工具類時(shí)間校驗(yàn)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12

最新評(píng)論

高密市| 温宿县| 洛南县| 三明市| 祁连县| 靖西县| 伊川县| 尉犁县| 谷城县| 建德市| 武山县| 汝南县| 建湖县| 娱乐| 温州市| 贺州市| 永宁县| 六枝特区| 探索| 奉贤区| 荥阳市| 巴林左旗| 桃江县| 靖安县| 海兴县| 浮山县| 阜宁县| 全州县| 虹口区| 新疆| 东至县| 旅游| 德清县| 渝中区| 寻乌县| 仁寿县| 太湖县| 青神县| 临朐县| 武穴市| 珲春市|