@Autowired警告:Field injection is not recommended

在IDEA升級2017版后闲礼,發(fā)現(xiàn)以前使用的 @Autowired 出現(xiàn)了個警告 Field injection is not recommended

@Autowired的三種使用方式

@Controller

public class Controller{

? ??//通過構(gòu)造器注入

? ? private final DependencyA dependencyA;

????private final DependencyB dependencyB;

? ? @Autowired

? ? public Controller(DependencyA dependencyA,DependencyB dependencyB){

? ? ? ? this.dependencyA = dependencyA;

????????this.dependencyB = dependencyB;

? ? }

? ? //通過set方法注入

? ?private DependencyA dependencyA;????

????private DependencyB dependencyB;?

? ? @Autowired

? ? public void setDependencyA(DependencyA dependencyA){

? ? ? ? this.dependencyA = dependencyA;

? ? }

????@Autowired

????public void setDependencyB(DependencyB dependencyB){? ? ? ? ? ? ??

????????this.dependencyB = dependencyB;? ??

????}? ?

? ? //通過field注入

? ? @Autowired

? ? private DependencyA dependencyA;

? ? @Autowired

????private DependencyB dependencyB;?

}

單一職責(zé)原則

當(dāng)你使用構(gòu)造器方式注入,構(gòu)造器參數(shù)的數(shù)量就會變得太多以至于很容易出現(xiàn)錯誤袱衷。擁有太多的依賴通常意味著你的類要承擔(dān)更多的責(zé)任鲸匿,明顯違背了單一職責(zé)原則和關(guān)注點分離缤剧,這是一個很好的現(xiàn)象,表明該類需要進(jìn)一步檢查和重構(gòu)。在直接注入filed時屡立,沒有這樣的危險信號,因為這種方法可以無限擴(kuò)展搀军。

依賴隱藏

使用DI容器意味著類不再對依賴負(fù)責(zé)膨俐,獲取依賴的職責(zé)從類中抽離出來,DI容器會幫你裝配罩句,當(dāng)類不再負(fù)責(zé)獲取依賴時焚刺,它應(yīng)該使用方法或構(gòu)造器去了解類本身需要什么,以及它是可選的(setter方法)還是強(qiáng)制的(構(gòu)造器)门烂。

DI Container Coupling

One of the core ideas of the DI frameworks is that the managed class should have no dependency on the DI container used. In other words, it should be just a plain POJO, which can be instantiated independently, provided you pass it all the required dependencies. This way you can instantiate it in a unit test without starting the DI container and test it separately (with a container that would be more of integration test). If there is no container coupling, you can use the class either as managed or non-managed or even switch to a new DI framework.

對上面英文段的解釋:

受DI容器管理的類只是一個普通的java對象乳愉,是能夠被獨立實例化的。通過這種方式屯远,可以在單元測試中實例化它蔓姚,而不需要啟動DI容器去實例化它。如果沒有DI容器耦合慨丐,不管有沒有被DI容器管理赂乐,都可以實例化這個類,甚至切換到新的DI框架咖气。簡而言之挨措,就是可以脫離spring的管理去操作這個類挖滤。

有一種方式(調(diào)用默認(rèn)構(gòu)造器)來創(chuàng)建對象就是使用new關(guān)鍵字,但是當(dāng)這個對象缺少一些必要的依賴浅役,調(diào)用的時候就會出現(xiàn)空指針異常斩松。

這樣的類不能在DI容器(測試、其他模塊)之外重用觉既,因為除了反射之外惧盹,沒有其他方法向它提供所需的依賴項。

舉個例子:

public class DependencyA {

? ? public void a(){

? ? ? ? System.out.println("dependencyA");

? ? }

}


public class POJO {

? ? @Autowired

? ? private DependencyA dependencyA;

? ? public void execute(){

? ? ? ? dependencyA.a();

? ? }

}


public class Test {

? ? public static void main(String[] args) {

? ? ? ? POJO pojo = new POJO();

? ? ? ? pojo.execute();

? ? }

}

當(dāng)你執(zhí)行execute()方法時就會報空指針異常瞪讼,是因為DependencyA沒有被創(chuàng)建钧椰,使用這種方式(@Autowired)也不會強(qiáng)制你去創(chuàng)建類所需的依賴,所以當(dāng)使用者調(diào)用的方法的時候就可能會出現(xiàn)空指針異常符欠。

不變性

與構(gòu)造函數(shù)不同嫡霞,字段注入不能用于向final字段指定依賴,從而有效地實現(xiàn)可變的對象希柿。

Setters

setter注入適合于可選依賴項

Constructors

構(gòu)造函數(shù)注入適合于強(qiáng)制依賴

結(jié)論:

Field注入應(yīng)該盡可能地去避免使用诊沪,構(gòu)造器注入更適合強(qiáng)制性的注入旨在不變性,Setter注入更適合可變性的注入曾撤。

參考:Field Dependency Injection Considered Harmful | Vojtech Ruzicka's Programming Blog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末端姚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挤悉,更是在濱河造成了極大的恐慌渐裸,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件装悲,死亡現(xiàn)場離奇詭異昏鹃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)衅斩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門盆顾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怠褐,“玉大人畏梆,你說我怎么就攤上這事∧卫粒” “怎么了奠涌?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長磷杏。 經(jīng)常有香客問我溜畅,道長,這世上最難降的妖魔是什么极祸? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任慈格,我火速辦了婚禮怠晴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浴捆。我一直安慰自己蒜田,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布选泻。 她就那樣靜靜地躺著冲粤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪页眯。 梳的紋絲不亂的頭發(fā)上梯捕,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音窝撵,去河邊找鬼傀顾。 笑死,一個胖子當(dāng)著我的面吹牛忿族,可吹牛的內(nèi)容都是我干的锣笨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼道批,長吁一口氣:“原來是場噩夢啊……” “哼错英!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起隆豹,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤椭岩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后璃赡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體判哥,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年碉考,在試婚紗的時候發(fā)現(xiàn)自己被綠了塌计。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡侯谁,死狀恐怖锌仅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墙贱,我是刑警寧澤热芹,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站惨撇,受9級特大地震影響伊脓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魁衙,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一报腔、第九天 我趴在偏房一處隱蔽的房頂上張望株搔。 院中可真熱鬧,春花似錦纯蛾、人聲如沸邪狞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆卓。三九已至,卻和暖如春米丘,著一層夾襖步出監(jiān)牢的瞬間剑令,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工拄查, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留吁津,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓堕扶,卻偏偏與公主長得像碍脏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稍算,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理典尾,服務(wù)發(fā)現(xiàn),斷路器糊探,智...
    卡卡羅2017閱讀 134,695評論 18 139
  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器钾埂,...
    simoscode閱讀 6,721評論 2 22
  • 1.1 Spring IoC容器和bean簡介 本章介紹了Spring Framework實現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,587評論 0 8
  • 三十萬可能對于一些人來說是小錢,但是對于普通人來說科平,我相信還是一筆重要的資金褥紫。 怎樣在短時間內(nèi)借到一筆錢。話說兩三...
    2ea7dac0fd80閱讀 5,824評論 0 5
  • 每一名優(yōu)秀的教師瞪慧,真的都是讓教育浸潤在愛中的髓考。做一個老師首先得做一個有愛的人,善良的人弃酌。薛岳娥老師親身經(jīng)歷的故事氨菇,...
    令令子閱讀 488評論 0 1