依賴注入的主要類型

依賴注入的主要類型

  1. 構(gòu)造器注入
  2. Setter注入
  3. 接口注入(不推薦)
  4. Filed變量注入(不推薦)

Setter注入 battle 構(gòu)造器注入

  1. 構(gòu)造器注入

    Spring4.X以后鼓勵(lì)使用構(gòu)造器注入,構(gòu)造器注入的組件通常需要在構(gòu)造的時(shí)候完成初始化。即弄慰,一般依賴的組件以及組件依賴的外部輸入等第美,都需要我們?cè)跇?gòu)造的時(shí)候完成初始化。

  • 實(shí)現(xiàn)業(yè)務(wù)組件時(shí)陆爽,如果該對(duì)象是一個(gè)不變的對(duì)象什往,構(gòu)造器注入確保了這個(gè)對(duì)象不為空。即慌闭,當(dāng)依賴一個(gè)對(duì)象時(shí)别威,這個(gè)對(duì)象必須存在,因此不能為空驴剔。哪怕這個(gè)對(duì)象不存在或者實(shí)在是為空的話省古,也可以通過(guò)ObjectProvider(Spring 4.X引入,一種類型安全的方式)的getIfAvailable()方法來(lái)進(jìn)行返回仔拟。

  • 構(gòu)造器注入的優(yōu)點(diǎn):

    • 構(gòu)造器注入可以把一般都不會(huì)變更的字段衫樊,賦值的字段定義為final,無(wú)論是從線程安全的角度還是未來(lái)可變性的角度來(lái)說(shuō)都是比較友好的利花。通常習(xí)慣在面向?qū)ο髸r(shí),對(duì)象都是不變的载佳,即一旦創(chuàng)建好就不要變炒事,如果這個(gè)對(duì)象要變更,可以把這個(gè)對(duì)象重新生成一份蔫慧,使用新生成的這個(gè)對(duì)象挠乳,而不是老的對(duì)象。
    • 如果用多個(gè)Java Bean的時(shí)候姑躲,會(huì)減少一些代碼睡扬,主要是指有Setter/getter方法。
    • 構(gòu)造器注入就有這個(gè)先后順序的約束約束黍析,一般就是根據(jù)Java語(yǔ)法就是誰(shuí)在前卖怜,誰(shuí)在后,進(jìn)行初始化順序的阐枣,不能由客戶端任意修改马靠。
  • 構(gòu)造器注入如果參數(shù)過(guò)多,代碼看起來(lái)不是很友好蔼两,一般需要做一些重構(gòu)甩鳄,換句話說(shuō)就是不應(yīng)該把太多的職責(zé)放到一個(gè)類里,一個(gè)方法里不應(yīng)該有太多的輸入额划。

      //構(gòu)造器注入
      private DependencyA dependencyA;
        private DependencyB dependencyB;
        private DependencyC dependencyC;
    
        @Autowired
        public DependencyInjection(DependencyA dependencyA, DependencyB dependencyB, DependencyC dependencyC) { 
            this.dependencyA = dependencyA;
            this.dependencyB = dependencyB;
            this.dependencyC = dependencyC; 
        }
    
  1. Setter注入

    Spring3.X鼓勵(lì)使用妙啃,Spring 4.X以后認(rèn)為是可選的注入方式,Setter注入字段本身是可變化的俊戳,所以對(duì)象本身或注入的內(nèi)容可以為空揖赴。如@Autowired注解默認(rèn)會(huì)把相關(guān)的依賴強(qiáng)行注入馆匿,如果依賴不存在,根據(jù)屬性required(默認(rèn)為true)設(shè)置為false來(lái)進(jìn)行控制储笑。

    //不為age屬性傳遞任何參數(shù)甜熔,下面的示例也會(huì)成功運(yùn)行,但是name屬性則需要一個(gè)參數(shù)
    public class Student {
       private Integer age;
       private String name;
       
       @Autowired(required=false)
       public void SetAge(Integer age) {
          this.age = age;
       }  
       
       @Autowired
       public void SetName(String name) {
          this.name = name;
       }   
    }
    

    Setter注入的優(yōu)缺點(diǎn)

    • Setter方法通常能夠讓對(duì)象變得更加可配置或者在某個(gè)時(shí)候可以被重新注入突倍。換言之腔稀,依賴注入的時(shí)候,也許是第一次注入羽历,那么是再次注入的話焊虏,也不會(huì)有一個(gè)新的對(duì)象的變化。
    • Setter注入對(duì)具有默認(rèn)值的對(duì)象非常有效秕磷,意味著并非所有屬性都需要在運(yùn)行時(shí)提供诵闭。對(duì)象里有個(gè)默認(rèn)值,Setter方法可以覆蓋掉這個(gè)初始值澎嚣。
    • Setter中的order無(wú)法確認(rèn)疏尿,比如Student對(duì)象有個(gè)SetAge/SetName兩個(gè)方法,至于哪個(gè)先易桃,哪個(gè)后并沒(méi)有一定的規(guī)約來(lái)進(jìn)行約束褥琐。
    • Setter的注入,只有當(dāng)對(duì)象是需要被注入的時(shí)候它才會(huì)幫助我們注入依賴晤郑,而不是在初始化的時(shí)候就注入
         //Setter注入
        private DependencyA dependencyA;
        private DependencyB dependencyB;
        private DependencyC dependencyC;
        @Autowired
        public void setDependencyA(DependencyA dependencyA) {
            this.dependencyA = dependencyA;
        }
        @Autowired
        public void setDependencyB(DependencyB dependencyB) {
            this.dependencyB = dependencyB;
        }
        @Autowired(required=false)
        public void setDependencyC(DependencyC dependencyC) {
            this.dependencyC = dependencyC;
        }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敌呈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子造寝,更是在濱河造成了極大的恐慌磕洪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫龙,死亡現(xiàn)場(chǎng)離奇詭異析显,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赐稽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)叫榕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人姊舵,你說(shuō)我怎么就攤上這事晰绎。” “怎么了括丁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵荞下,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)尖昏,這世上最難降的妖魔是什么仰税? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮抽诉,結(jié)果婚禮上陨簇,老公的妹妹穿的比我還像新娘。我一直安慰自己迹淌,他們只是感情好河绽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著唉窃,像睡著了一般耙饰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纹份,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天苟跪,我揣著相機(jī)與錄音,去河邊找鬼蔓涧。 笑死件已,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的元暴。 我是一名探鬼主播拨齐,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昨寞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起厦滤,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤援岩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后掏导,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體享怀,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年趟咆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了添瓷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡值纱,死狀恐怖鳞贷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虐唠,我是刑警寧澤搀愧,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響咱筛,放射性物質(zhì)發(fā)生泄漏搓幌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一迅箩、第九天 我趴在偏房一處隱蔽的房頂上張望溉愁。 院中可真熱鬧,春花似錦饲趋、人聲如沸拐揭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)投队。三九已至,卻和暖如春爵川,著一層夾襖步出監(jiān)牢的瞬間敷鸦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工寝贡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扒披,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓圃泡,卻偏偏與公主長(zhǎng)得像碟案,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颇蜡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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