ioc,Inversion of Control(控制反轉),是Spring中的一種設計思想而非技術。 我們可以從4個方面理解ioc: ①誰控制誰? ——Ioc容器控制對象。 ②控制了什麼? ——Ioc容器控制了獲取對象及其外部資源。 ③為什麼是反轉? ——傳統的javaSE技術是手動new對象的, ...
ioc,Inversion of Control(控制反轉),是Spring中的一種設計思想而非技術。
我們可以從4個方面理解ioc:
①誰控制誰? ——Ioc容器控制對象。
②控制了什麼? ——Ioc容器控制了獲取對象及其外部資源。
③為什麼是反轉? ——傳統的javaSE技術是手動new對象的,通過new的對象直接控制資源的(相當於“正轉”);而spring是使用Ioc容器創建對象並獲取外部資源,相當於通過第三方查詢獲取(相當於“反轉”)。即:傳統技術是主動創建對象,而ioc思想是被動接受依賴對象。
④怎麼實現反轉的?——通過依賴註入(DI)的方式實現反轉(這裡的反轉即:獲取對象的方式)。
DI,Dependency Injection(依賴註入),是將容器動態地註解到應用程式中。
簡單地說,DI是通過註解的方式獲取到對象以及一些外部資源。
DI和ioc其實是一個東西,只是理解的層面不同。通俗地說,ioc層面理解就是:獲取對象的方式不再是我們主動創建尋找,而是多了個‘中介’去幫我們查詢對象並尋找。DI層面理解就是:寫代碼的時候,要用到某個對象及資源,我們不再需要去查詢那個對象在哪裡,並且new對象,我們只需要配置好就可以直接通過@
獲取我們需要的資源。
耦合和內聚
值得一提的是,ioc思想由於通過第三方ioc容器創建對象,能夠減少代碼的耦合性,從而使得代碼更優。
看到這裡也許有些人開始蒙了,為啥低耦合代碼更優?這樣一句話你或許聽過:“我們寫代碼都要儘量向低耦合高內聚靠近!”這說明,低耦合高內聚的代碼更好,你只需要知道這一點就夠了。至於它們的理解,請繼續往下看:
耦合和內聚都是評判軟體程式優劣的一個標準。
理解耦合:
耦合指的是元素與元素之間的連接關係、依賴程度等。
舉個例子,在類1引用類2的變數,我們需要new 類2的對象,這個時候類1和類2產生了一種依賴性:假如類2發生了改變或者消失,類1就會出現問題(報錯)。類1與類2的這種關係,就是一種耦合,因為它們之間有一種依賴性。
上述只有兩個類作比較,看不出什麼,但是如果很多個類之間相互引用(也就是“高耦合”),創建其他類的對象,如果其中一些類做了修改或其他什麼,想象一下,會報多少錯?查詢起來會多麻煩?工作效率是不是大打折扣了?
所以,低耦合的代碼會更優。
有的人可能會問,那為什麼ioc思想相對傳統JavaSE技術就是低耦合的?
ioc思想是通過Ioc容器創建對象,相當於通過第三方查詢對象並獲取外部資源,是沒有直接建立聯繫的,因此也就不存在高耦合的問題,註解之後資源就自動引入了。
理解內聚:
內聚通常指的是功能內聚,即程式之間的共同性。
用一句俗語解釋:術業有專攻。各行各業,只需要管屬於他們行業範圍內的事情就可以了。內聚也是這個意思。
舉個例子,我要寫一個心理測試系統,那麼主要功能就是心理測試。我寫的所有代碼如果都是心理測試核心代碼,那麼就是100%內聚,也就是超高內聚了,當然只是舉個例子便於理解哈。
高內聚就是要我們寫的代碼儘可能相關,也就是所有程式儘可能圍繞某個具體的功能點,這樣程式更具體,也更便於管理。