23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

簡介

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 的 加載包含以下步驟

  1. 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 功能

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

spring框架

我將如何重新實現IOC

正如上面Spring的加載原理所說,我將按照上面步驟,自己實現一個 Spring IOC.

實現IOC實例

定義一個需要IOC容器加載的接口以及接口的實現類,如下

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

定義接口CarService

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

然後註冊service,Spring 中 Bean 的註冊方式有多種,主要是 通過註解和xml中配置文件的方式,在這裡,為了方便起見,我直接創建一個用戶註冊的註冊器 BeanRegisterContant ,並將 CarServiceImpl注入進去,如下

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

用於註冊Bean

下面,創建一個工廠類的頂級接口BeanFactory,並實現它,用於創建和管理Bean,真正管理Bean 的其實是它的實現類
ConstantApplicationContext,如下

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

創建Bean的頂級接口

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

用於管理所有的Bean

好了,到此為止,所有準備工作已經完成,Spring IOC 的雛形已經出了了,當然真正的 Spring IOC 要比這個複雜,但是,原理是一樣的,下面看看測試代碼

23中設計模式----實現spring 的IOC(簡單工廠+單例+懶加載)

在測試代碼中,首先創建一個 ConstanApplicationContext (這其實相當於Spring中的加載器
ClassPathXmlApplicationContext,都是用於加載和Bean的)。然後調用 getBean()方法,根據名稱獲取Bean,當然,你也可以根據Class獲取,實現都是一樣的,測試結果如下

我是一輛車,我正在高速公路上行駛。。。。。。

自此,整個過程完成。

總結

有些東西看起來非常困難,其實原理就是這麼簡單,只是實現比較複雜。當然真正的 Spring IOC 的實現比這個複雜,要考慮的東西也比較多,但是基本原理是一樣的,我這個是簡化版的 IOC,但是對理解 Spring IOC 會有幫助,在此基礎上,去看 Spring ioc 的源碼,也會更容易理解

創作不易,轉載請聲明,如有問題、意見或建議,請在下方的評論區留言!


分享到:


相關文章: