用最簡單的方式理解 IoC 控制反轉

四葉筆記 發表於 2021-10-16

思想引入

假設一個系統原先只設定有一個預設的方法去完成業務,這裡舉例這個原先設定開發的是 UserDaoImpl(可能有些牽強,但是不影響我們對邏輯的理解)這樣一個業務。

後來有一天,需求變了,業務流程大改,這裡舉例改為 UerDaoOracleImpl,這時候我們可能需要修改 UserService中對Dao層的引用,即修改原理的UserDaoImpl為UerDaoOracleImpl。

再後來,使用者需求又變了,比如來了個 UserDaoMysqlImpl,這時候可能有得修改程式碼了吧。

好吧,那改吧,但是呢又有一天產品經理跑過來說改回原來的第一種,emmmm

示意圖如下:

用最簡單的方式理解 IoC 控制反轉

既然這樣,和不把這個修改權丟給使用者呢?要是能把這個修改權交給使用者自由適用,那我們是不是可以把節省下來的時間拿去學新的技術了呢?是不是讓使用者感覺更好了呢?

就這樣IOC思想來了!

IOC思想

IoC,Inversion of Control,控制反轉,是一種設計思想。

即把物件的建立,從原來的由原來的程式自己控制,變成了向外轉給第三方/使用者/容器來根據需要自定義管理建立。

舉個和程式碼不是很相關的例子,例如以前的網站幾乎都是隻有一種風格,網站管理者設計的是什麼樣使用者看到的就是什麼樣,但是現在不一樣了,不少網站支援使用者根據自己的喜好隨意切換風格、皮膚,這也是控制反轉思想的一種應用吧。

IOC簡單應用

好,現在就簡單的應用 IoC 這種思想來改變上圖這的邏輯吧。

假設我們這裡的 UserController就是對外(使用者)的介面,即別的人/系統回從這裡開始呼叫我們的業務邏輯。

現在我們就在這裡直接接入使用者需求,例如介面使用方說用 UserDaoMysqlImpl,好,那你就自己new一個UserDaoMysqlImpl物件傳入我的預留的介面就行唄。

再過兩天介面呼叫者又想用 UerDaoOracleImpl 這套了,也行,你自己set進去一個UerDaoOracleImpl就能呼叫我對UerDaoOracleImpl這套業務的支援了。

就這樣,IoC 思想用上了,使用的人能按照自己的意思來了,我們也節省力氣了。

示意圖如下:

用最簡單的方式理解 IoC 控制反轉

好了,到這裡對IOC思想我們已經有了解了,那麼Spring這個傢伙又是怎麼把IOC這種思想完美的應用了呢?

下一篇探討: