簡介
Spring IOC 是 Spring 的框架的核心部分,所謂 IOC ,就是由 Spring IOC 容器來負責對象的生命週期和對象之間的關係,它將Bean的控制和創建權全部歸於 Spring 的 IOC 容器,使得開發更加簡單優雅,獲取 Bean 更加方便。那麼Spring IOC 是如何實現的呢,我們有怎麼實現 的 IOC 呢?本章將帶您實現一個簡單的 IOC ,如果您已經讀過我前面寫的 《
23種設計模式之------單例模式(不同應用場景下的實現方案)》 和 《23種設計模式之------工廠模式(工廠與簡單工廠將如何選擇?)》,將更有助於您理解這篇文章本章將一下幾個部分組成
- Spring IOC 容器Bean加載原理
- 我將如何重新實現IOC
- 實現IOC實例
Spring IOC 容器Bean加載原理
Spring 中 Bean 的 加載包含以下步驟
- Bean的定義與註冊
還記得嗎?我們每次 使用 Spring IOC 容器管理 Bean 時,都會先 定義好一個接口(比 如Service)和接口的實現類(比如ServiceImpl),然後通過註釋(比如@Service)的方式或者直接在XML中引入的方式註冊Bean。這其實就是Bean 的定義與註冊,只有這樣,Spring IOC 容器才可以管理我們的 Bean,
2、Bean的加載
Spring提供了一個BeanFactory的接口,這個接口的主要功能就是創建並加載Bean
3、將已加載的 Bean 放入 IOC 容器
Spring提供一個ApplicationContext的容器,用於存入所有已加載的 Bean,使用的時候直接獲取
4、獲取Bean
Spring 的 BeanFactory 接口 提供一個 getBean 方法,這個方法就是對外提供的獲取Bean的方法,Spring IOC 默認使用的是懶加載的方法,本章也將以懶加載的方式實現 IOC 功能
我將如何重新實現IOC
正如上面Spring的加載原理所說,我將按照上面步驟,自己實現一個 Spring IOC.
實現IOC實例
定義一個需要IOC容器加載的接口以及接口的實現類,如下
然後註冊service,Spring 中 Bean 的註冊方式有多種,主要是 通過註解和xml中配置文件的方式,在這裡,為了方便起見,我直接創建一個用戶註冊的註冊器 BeanRegisterContant ,並將 CarServiceImpl注入進去,如下
下面,創建一個工廠類的頂級接口BeanFactory,並實現它,用於創建和管理Bean,真正管理Bean 的其實是它的實現類
ConstantApplicationContext,如下
好了,到此為止,所有準備工作已經完成,Spring IOC 的雛形已經出了了,當然真正的 Spring IOC 要比這個複雜,但是,原理是一樣的,下面看看測試代碼
在測試代碼中,首先創建一個 ConstanApplicationContext (這其實相當於Spring中的加載器
ClassPathXmlApplicationContext,都是用於加載和Bean的)。然後調用 getBean()方法,根據名稱獲取Bean,當然,你也可以根據Class獲取,實現都是一樣的,測試結果如下
我是一輛車,我正在高速公路上行駛。。。。。。
自此,整個過程完成。
總結
有些東西看起來非常困難,其實原理就是這麼簡單,只是實現比較複雜。當然真正的 Spring IOC 的實現比這個複雜,要考慮的東西也比較多,但是基本原理是一樣的,我這個是簡化版的 IOC,但是對理解 Spring IOC 會有幫助,在此基礎上,去看 Spring ioc 的源碼,也會更容易理解
創作不易,轉載請聲明,如有問題、意見或建議,請在下方的評論區留言!