《Spring揭祕》學習筆記——IOC是什麼

DrawnBreak發表於2020-11-30

Spring揭祕是本很老的書了,京東上想買正版書都買不到了,畢竟Spring迭代那麼多版,估計文章內的很多程式碼都不適用了。
但是在Spring系列中,這本書評分是最高的,年初疫情期間趁著工作量不大把他看完了,現在希望能結合工作專案所用的Spring框架,複習一下並來看看該框架的實際變化。
在這裡插入圖片描述

IoC是隨著近年來輕量級容器(Lightweight Container)的興起而逐漸被很多人提起的一個名詞,它 的全稱為Inversion of Control,中文通常翻譯為“控制反轉”,它還有一個別名叫做依賴注入(Dependency Injection)

本質上就是:
如果某個Java物件裡有一些成員
那麼儘量不要把這些成員寫死(例如某個成員的型別是A, 不要寫死成A=new A1()或者A=new A2())
而要通過 構造器 或者get、set來注入進來

換句話說,在這個物件的實現中,我們看不到成員物件的具體賦值, 一切都通過外部來決定恆成員是什麼

而在Spring裡,這個構造器和get、set都通過IOC SerivceProvider來提供
這個圖很經典
在這裡插入圖片描述

3種注入方式:

  • 構造方法注入:Ioc用構造方法去注入。
    好處是一旦構造好了,就可以馬上用。 而且只需要對應類名和引數列表。缺點是引數多的話會很麻煩。

  • setter方法注入: Ioc用setXXX去注入成員。
    良好。易擴充套件。通過set去設定成員。

  • 介面注入: 必須要實現介面,然後介面裡方法的引數為真正傳入的成員物件。這個方式不提倡,有侵入性,一旦新增,其他全要開

介面注入看了好幾遍才想明白是啥意思,換個通俗易懂的解釋:

  • 構造方法注入: Ioc只要知道類名和構造引數, 即可給你用反射傳進去,。
  • set方法注入: Ioc只要類名和你有哪些成員, 即可寫反射的程式碼給你注入,都是setXXX,處理方式不會有變動。
  • 介面方注入: Ioc 必須知道你有哪些注入介面,才能給你注入。 比如你用Init(A a)來注入, 於是Ioc必須也指定init這個方法, 再加引數,才給給你注入
    明顯介面注入,如果init方法改名了,可能會造成大面積的注入修改(因為其他地方可能都用了Init去構造了,然後爆炸)
    而構造和set方式幾乎都是相同的注入操作,只要改入參和類名即可。

例子:
IOC ServiceProvider
在這裡插入圖片描述

就是如何相當於服務員
對於業務類,不需要知道自己的成員具體是誰
而如何確定自己的真正成員,來自於IOC SeviceProverdier

。它可以是一段程式碼,也可以是一組相關的類,甚至可以是比較通用的IoC框架或 者IoC容器實現
。Spring 的IoC容器就是一個提供依賴注入服務的IoC Service Provider

IOCSP的職責:
業務物件的構建管理,即怎麼建立依賴物件
業務物件間 的依賴繫結, 即怎麼確定誰依賴誰。

IOCSP的管理方式:
1.
直接編碼,例如寫1個map來做 類->具體子類的對應關係。然後在寫map.put. get之類的程式碼來自己主動注入
2.
文字檔案(xml、配置檔案),然後自己去getXMl或者getPropetris解析
3.
註解, 相當於不用自己寫map的put、get, 而是通過某個框架的註解,確定注入方式,然後去在那個框架對應的程式碼或者配置檔案中寫就行了。 其實就是1、2的升級版,不用自己去做解析和儲存操作,你只要去框架那裡寫對應依賴關係即可。

相關文章