源碼成神之路:Spring Framework源代碼解析之IOC容器,一文通透

最近開始寫博客,覺得這樣對自己很有好處,可以從頭到尾把散亂的知識梳理一遍,通過自己的理解把它寫下了,這個過程受益匪淺。今天寫Spring的隨筆,使用Spring大概有3年時間,可大多時候只是使用它的特性,並沒有深入學習它。Spring的源碼據網友說寫的很漂亮,我也來學習一下。

IOC之HelloWorld

假設我們有這樣一個業務,根據產品的ID,從產品庫中取得該產品的詳細信息。用戶接口可能是Web瀏覽器、桌面軟件或者超市的條形碼掃描器,總之會用一個類來接受用戶請求,我們暫且定名為ProductAction.java.

而具體處理邏輯則是放在產品服務接口中,ProductService.java。該接口有一個實現類ProductServiceImpl.java,具體實現寫在ProductServiceImpl.java中。代碼如下:

ProductService.java

源碼成神之路:Spring Framework源代碼解析之IOC容器,一文通透

ProductServiceImpl.java

源碼成神之路:Spring Framework源代碼解析之IOC容器,一文通透

ProductAction. java

源碼成神之路:Spring Framework源代碼解析之IOC容器,一文通透

Spring配置文件

+ View Code

這樣就可以實現往ProductAction類中注入指定的ProductService,而具體業務的交給了ProductServiceImpl處理。

何為IOC?

從上例可以看出,通過Spring的IOC特性,將ProductService具體的實現類注入到ProductAction中,從而ProductAction可以調用ProductService的方法進行邏輯處理。在沒有使用Spring的情況下,要完成以上功能,也可以通過new關鍵字,將ProductSerivce接口的實現類實例化出來。但他們的區別在哪裡呢?當使用new關鍵字實例化對象時,ProductAction類對ProductService實現類的實例化具有控制權;而使用Spring IOC時,ProductAction和ProductService之間的關係則通過Spring來配置(通過註解或者XML配置文件),而對ProductService的控制權由ProductAction轉移到了Spring IOC容器上,這就是所謂的控制反轉。IOC特性的直接用處就是解耦,在ProductAction中,我們並沒有看到對ProductService實現類的依賴,而它們之間的依賴關係則是通過第三方(Spring IOC)來維護。

IOC工作流程

Step1:系統運行時,Spring開始啟動,指定將加載的配置文件。

應用程序:

<code>ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");/<code>

Web應用:

web.xml

源碼成神之路:Spring Framework源代碼解析之IOC容器,一文通透

Step2:接著AbstractApplicationContext類開始調用prepareRefresh方法,對ApplicationContext進行刷新。

Step3:XmlBeanDefinitionReader類調用loadBeanDefinitions方法進行配置文件加載,配置文件中定義的Java Bean會被加載在IOC容器的一個HashMap當中。HashMap的key就是Bean的id,HasMap的value就是這個Java Bean。(當中詳細過程分為定位、載入、註冊,我們後面再詳細說明)

Step4:依賴注入,當用戶向IOC容器索要Bean時,將觸發BeanFactory中的getBean方法,當然不同類型的配置會調用不同的BeanFactory,如XmlBeanFactory。從而得到相應的JavaBean。

小結

上面簡要介紹了Spring IOC的特性,對IOC的理解,IOC容器的大致工作流程,下文將依據上述流程詳細解析IOC容器的實現。


分享到:


相關文章: