Spring的IOC(依賴注入和控制反轉)

2021-10-02 17:12:08 字數 2398 閱讀 7041

spring框架面試筆試必問之一!非常重要也非常強大,說實話一開始仿照著spring mvc配置搭建起來,再寫幾句增刪改查,真的配不上叫做學會了那個框架。框架是n種優秀的設計模式和一些很高深的技術組合在一起的完美的精緻的產物!

誰在剛畢業的時候,都會去背ioc的概念,背來背去,還是稀里糊塗,就算背的滾瓜爛熟了,要畫流程圖實現又是考死一大片。所以,我這篇部落格,意在幫助所有學習spring框架的人,深刻而且清晰地了解ioc!

說實話,我寫spring寫得也不少了,真正仔細去弄明白它的時候,確實也是被震撼到了,跪著看完那些天才大佬的設計,感覺自己只是個充數的碼農而已。

廢話不多說,在看這篇文章之前,必須有單例模式和工廠模式和反射機制建立物件的基礎,要懂得什麼叫做全限定名和容器類的概念,還要懂得類載入過程。這些在我其他部落格都有講解,必須有這些基礎,才能真正感受到ioc的魅力。

呼~舒緩一下心情。前方高能。是的它的確做了這種事,下面是具體實現:beanfactory底層,就是通過乙個properties物件來讀取指定路徑下的配置檔案,配置檔案寫的什麼呢?就可以是用key - value 形式寫的 類名 和 全限定名。

那properties物件迴圈讀取了整個配置檔案,獲取了全部類名和全部類的全限定名,那又能怎麼樣呢?全限定名!已經足夠讓我們建立物件!所以!我們在迴圈中!不斷使用反射機制通過全限定名建立乙個又乙個的物件!同時還會定義乙個map,把類名做key,建立出來的物件的引用位址做value,一層層迴圈存入map。

這個map。就已經有全部的類名和對應的例項化物件的引用!從此它叫容器。再定乙個getbean(***)方法,***就是你要用的類名(當然也不侷限於類名)。然後?map中的 k - v 結構,根據key找value的方法,直接返回物件的引用!

當我們再需要用到物件a a , 根本不需要自己拿類,直接呼叫乙個beanfactory中的getbean(***)方法,傳入a,也就是getbean(a);就可以了。順利拿到例項化好的物件,那就呼叫方法或者屬性還不是輕而易舉的事情。

@component註解就是把修飾的類通過工廠的反射建立乙個物件,並將建立出來的單例物件存放入容器中。

@service,@controller,@respository這幾個註解都是同樣用法,只不過我們知道spring分mvc,不同邏輯層面的類最好用指定的註解加入工廠。

@controller 就是控制器層的class 建立物件加入容器的註解。

@service 就是服務層的,這裡一般寫一大堆的業務邏輯,實現增刪改查和複雜運算的類。

@respository是持久層的,負責與資料庫互動的類。

那假如,我有一百個類,那就在xml配置中寫100個?開什麼玩笑這不是更麻煩了嗎?於是我們只需要在需要被注入到容器中的類上面輕輕加乙個@component註解,然後再去xml或者註解配置中指定一下掃瞄的包的檔案目錄:這樣spring就幫我們自動識別出你要注入的類,它就自動加入工廠,自動幫你建立物件並且管理物件的生命週期,在你要用的時候,你就直接注入使用。

@autowired

a a ;

@autowired就是注入的介面,它會根據型別a去容器中找到指定的物件返回,並注入到變數 a 裡面。完全按照型別匹配,跟key id 半毛錢關係都沒有。

是不是很神奇?ioc其實只是幫你管理,你要使用的話,還有乙個叫做依賴注入(di),仔細想想要從自己寫的工廠類中拿到乙個物件,是不是有個getbean(*** )方法?其實這一步去容器中找物件的步驟,spring就是通過@autowired註解實現了。

繞了一大圈,原來是這麼回事。現在開始摳字眼解釋。

控制,原來就是控制物件的生命週期,從建立,使用,銷毀一條龍服務。

反轉,原來就是把我們主動不同地new,翻身做主人,反轉成為宣告+注入就可以直接呼叫。

依賴,原來就是乙個類依賴著另外乙個類,另外乙個類不活了,這個類也活不下去,方法呼叫瘋狂報錯。

注入,就是把他所需要的類,通過註解的方式或者配置的方式注入進去,注入用的英文是injection,注射,也就是代表很微小的**改動,很小的創口。

依賴注入,就是元件與元件之間相互依賴的關係,都能由xml配置中的或者由乙個註解來解決依賴關係,不再需要一層層去例項化。同時在乙個a類中,呼叫另外乙個b類的方法,也可以說a類依賴b類,依賴關係一確立,就難免有耦合,所以解耦就是依賴注入。

控制反轉,原來就是從一開始的我們主動去new物件才能使用物件,變成了我們只要加兩個註解@component和@autowired,spring就自己幫我們建立好並送到我們跟前給我們使用。而且還不用我們去擔心物件單例模式的實現(不然我們有100個類,其中80個都要求單例模式,那我們光寫重複**都寫瘋了)又不用我們去管理物件的生命週期,那我們真的是一股腦寫業務**就行了。

spring 之 ioc 依賴注入

關於bean的名稱,這裡有條預設的規則,就是類的名稱,然後第乙個字母小寫 依賴注入 xml方式 通過setter方法注入依賴 元素的 property 子元素指明了使用它們的set方法來注入。可以注入任何東西,從基本型別到集合類,甚至是應用系統的bean。這種方式的缺點是你無法在其它地方重用這個pe...

Spring的IOC依賴注入例項

操作步驟 1.將所有的類在beans.xml 中建立 2.對有依賴的類完成注入 2.1.為每乙個依賴類建立相應的getter和setter 方法 2.2.建構函式注入 2.3.自動注入 不常用 開發中一般都是使用byname。autowire default byname 根據名稱來注入 setus...

Spring 學習筆記 IOC 依賴注入

簡述 spring 學習 ioc 依賴注入 1 直接使用原始類建立bean 2 使用工廠方法建立bean 3 使用工廠類建立bean 1 setter injection 2 constructor injection 建構函式注入 1 inner beans 2 collections map 3...