IoC,即Inversion of Control,中文也叫控制反轉,最常見於Spring中,但其實這個名字並不夠合理,控制轉移纔是一個貼切的名字。
首先看看什麼叫反轉,不論是英文的Inversion還是中文的”反轉“,意思都差不多:反轉,指轉向相反的方向。基本上應該屬於以下情況:以前向左現在向右;以前前進,現在後退;以前是牛市,現在是熊市;以前是被地主壓迫的農民工人,現在打倒地主資本家翻身做主人。
那麼我們再來看看控制反轉,指的是“以前是應用程序控制資源(對象、配置文件),現在是框架/IoC容器控制資源(對象、配置文件)“。仔細看看,應用程序和IoC容器其實沒有半毛錢的關係,所以他倆不存在”反轉“的可能性。事實上,二者之間的關係更像合作。可以看下面的比喻:
對象、配置文件相當於程序員,應用程序相當於軟件公司,IoC框架相當於外包公司。以前軟件公司自己招程序員,如果開發語言發生變化,不能隨意辭退重新招,這樣不夠靈活(相當於代碼寫死);而使用IoC框架以後,程序員全部成了外包人員,軟件公司要什麼,外包公司就給提供一個相應的程序員,如果開發語言發生變化,那麼軟件公司不需要開除員工重新招,找外包公司換一個即可(即使用配置文件,如果實現類變化,不需要修改代碼,只需修改配置文件爲新實現類即可)。程序員的社保等(被控制權)從軟件公司轉移到了外包公司。但不論什麼時候,真正幹活、創造價值的其實還是程序員。
綜上,控制(Control)從來沒有被反轉(Inversion),僅僅只是轉移(transition)。