日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

1. 說明

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

Field injection is not recommended

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

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

2. 依賴注入的類型

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

 

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

 

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

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


 

2.1 基于構造函數(shù)的依賴注入

在基于構造函數(shù)的依賴注入中,類構造函數(shù)被標注為@Autowired,并包含了許多與要注入的對象相關的參數(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... }

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

2.2 基于Setter的依賴注入

在基于setter的依賴注入中,setter方法被標注為@Autowired。一旦使用無參數(shù)構造函數(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; } }

和基于構造器的依賴注入一樣,在官方文檔中,基于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 基于屬性的依賴注入

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

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

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

3. 基于字段的依賴注入缺陷 3.1 不允許聲明不可變域

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

3.2 容易違反單一職責設計原則

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

S在SOLID中代表單一職責原則,即即一個類應該只負責一項職責,這個類提供的所有服務都應該只為它負責的職責服務。

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

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

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

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

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

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

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

3.4 隱藏依賴關系

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

4. 總結

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

5. 參考文檔

Field injection is not recommended – Spring IOC by Marc Nuri

spring官方文檔 1.4. Dependencies

 

原文:https://zhuanlan.zhihu.com/p/92395282

分享到:
標簽:SpringBoot
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定