概念:IoC (Inverse of Control,控制反轉),是指類A中有一個類B的對象,本來需要開發者在類A中初始化這個對象的,現在經過配置,spring可以自動地完成類A中的類B對象的初始化。這個過程也可以被叫作DI (Depend Injection,依賴注入),因為B類對象依賴于A類,通過spring 類B變量被注入到了A類的對象中。下面詳細介紹緣由:
IOC是spring的核心,貫穿始終。所謂的IOC,對于spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關系。舉個簡單的例子來說,我們如何找女朋友的?常見的情況是我們到處去看哪里有長得漂亮身材又好的的mm,然后想法設法的認識她們等流程,我們必須自己設計和面對每個環節。傳統的程序開發也是如此,在一個對象中,如果要使用另外的對象則必須得到它(要么自己new一個,要么從JNDI中查詢一個)使用完之后還要將對象摧毀等流程,對象始終會和其他的接口或類耦合在一起。、
然而,IOC是如何做到的呢,有點像你通過婚介找女朋友,通過第三方給你介紹,介紹認識之后,你們自己做自己想做的事情。然而這個第三方卻管理了很多男男女女的資料,你只要告訴你的需求,它就會通過你的需要給你找到相關的mm;如果找到不到就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什么東西,你需要什么東西,然后spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。如圖一,由于引進了中間位置的“第三方”,也就是IOC容器

圖1
IOC除了控制反轉這個稱呼之后,后面出現與之相關的稱呼DI(Dependency Injection, 依賴注入)來實現的。比如對象A需要操作數據庫,而我們以前每次都是在A中編寫代碼獲取一個Connection對象,而有spring就需要告訴spring,A中需要一個Connection對象,至于該對象怎么構造,何時構造,A對象無需知道。在系統運行時,spring會在適當的時候構造一個Connection,注入到A當中,這樣就完成了對各個對象之間關系的控制。而需要依賴Connection才能正常運行,而Connection是由spring注入到A當中的。這就是依賴注入。
作用(好處):配置靈活。 IOC模式,系統中通過引入實現了IOC模式的IOC容器,即可由IOC容器來管理對象的生命周期、依賴關系等,從而使得應用程序的配置和依賴性規范與實 際的應用程序代碼分開。其中一個特點就是通過文本的配件文件進行應用程序組件間相互關系的配置,而不用重新修改并編譯具體的代碼。 因為把對象生成放在了xml里定義,所以當我們需要換一個實現子類將會變成很簡單(一般這樣的對象都是現實于某種接口的),只要修改XML就可以了。雖然說修改XML后不需要重新編譯java代碼,但XML經常與java源代碼一起打包。所有想要修改XML的話,還是需要重新打包,還是免不了重新發布。就算修改java代碼,重新編譯這些修改后的代碼,也不是太麻煩。那使用IOC模式最本質的好處是什么呢?有一種說法是,寫大型程序的時候,會用到很多其他人開發的java類。當程序員甲用到程序員乙開發的java類A時,如果使用IOC,在程序員乙寫好XML配置文件后,程序員甲就不需要關心類A應如果初始化的問題,直接使用即可。IOC有利于在多人開發大型程序中提高開發效率。
實現原理:java的反射機制。spring ioc的整體流程,xml配置

| 步驟編號 | 完成的工作 |
| 1 | spring容器讀取配置文件,解析稱注冊表 |
| 2 | 根據注冊表,找到相應的bean實現類實例化bean |
| 3 | 把實例化之后的bean放到spring容器中 |
| 4 | spring開放準備好的bean供程序使用 |
新聞熱點
疑難解答