思想引入
假設一個系統原先只設定有一個默認的方法去完成業務,這里舉例這個原先設定開發的是 UserDaoImpl(可能有些牽強,但是不影響我們對邏輯的理解)這樣一個業務。
后來有一天,需求變了,業務流程大改,這里舉例改為 UerDaoOracleImpl,這時候我們可能需要修改 UserService中對Dao層的引用,即修改原理的UserDaoImpl為UerDaoOracleImpl。
再后來,用戶需求又變了,比如來了個 UserDaoMysqlImpl,這時候可能有得修改代碼了吧。
好吧,那改吧,但是呢又有一天產品經理跑過來說改回原來的第一種,emmmm
示意圖如下:

既然這樣,和不把這個修改權丟給用戶呢?要是能把這個修改權交給用戶自由適用,那我們是不是可以把節省下來的時間拿去學新的技術了呢?是不是讓用戶感覺更好了呢?
就這樣IOC思想來了!
IOC思想
IoC,Inversion of Control,控制反轉,是一種設計思想。
即把對象的創建,從原來的由原來的程序自己控制,變成了向外轉給第三方/用戶/容器來根據需要自定義管理創建。
舉個和代碼不是很相關的例子,例如以前的網站幾乎都是只有一種風格,網站管理者設計的是什么樣用戶看到的就是什么樣,但是現在不一樣了,不少網站支持用戶根據自己的喜好隨意切換風格、皮膚,這也是控制反轉思想的一種應用吧。
IOC簡單應用
好,現在就簡單的應用 IoC 這種思想來改變上圖這的邏輯吧。
假設我們這里的 UserController就是對外(用戶)的接口,即別的人/系統回從這里開始調用我們的業務邏輯。
現在我們就在這里直接接入用戶需求,例如接口使用方說用 UserDaoMysqlImpl,好,那你就自己new一個UserDaoMysqlImpl對象傳入我的預留的接口就行唄。
再過兩天接口調用者又想用 UerDaoOracleImpl 這套了,也行,你自己set進去一個UerDaoOracleImpl就能調用我對UerDaoOracleImpl這套業務的支持了。
就這樣,IoC 思想用上了,使用的人能按照自己的意思來了,我們也節省力氣了。
示意圖如下:

好了,到這里對IOC思想我們已經有了解了,那么Spring這個家伙又是怎么把IOC這種思想完美的應用了呢?
下一篇探討:《Spring中的IOC流程、實現》
