前言
哈哈?是不是很久沒寫博文了?總是各種原因(liyou)導致不寫博文。廢話不多說,騷年還是學習吧。
1 概述
Spring這個東西可真大啊,總共將近20個組件,但是知乎大神們告訴我,其中比較核心的組件只有core,context和beans。aop,web等都屬於核心上層的特性功能。爲了適應時代的變化,社會的發展,最近打算就先從context入手,而這裏面,我們又不得不提ApplicationContext。
注:以發文日期最新版github上spring源碼爲基礎進行閱讀,版本號,後期加上。
git地址:
https://github.com/spring-projects/spring-framework.git
1.1 IOC(控制反轉)
實際應用的程序基本上都是由多個類彼此合作來實現業務邏輯,這使得每個對象都需要與其合作的對象的引用。但是這樣的控制就導致了程序的耦合度非常大,不易於複用,更不易於做單元測試。
Martin Flowler 提出了“那些方面的控制被反轉了?”這個問題。他得出的結論是:依賴對象的獲得被反轉了。基於這個結論,他爲控制反轉創造了一個更好的名字:依賴注入。
依賴倒置原則:
- 高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。
- 抽象不應該依賴於具體實現,具體實現應該依賴於抽象。
依賴倒置也是設計模式六大原則之一。在Spring中IoC容器就是這個模式的載體,它可以通過容器對對象進行管理,在對象生成或初始化時直接將數據注入到需要其依賴的對象中。
1.2 ApplicationContext
Spring中容器要分兩類,一類是實現BeanFactory接口的簡單容器系列,這類容器只實現了容器的最基本功能(這個還不太瞭解);另一個是ApplicationContext應用上下文,也就是我們最常用的,項目中的配置文件大多數都是ApplicationContext-xxx.xml,它作爲容器的高級形態而存在。本文將對ApplicationContext進行閱讀講解。
首先看看ApplicationContext的簡略版類圖:
再看看包含方法的接口方法的ApplicationContext類圖:
從上圖ApplicationContext接口的繼承關係可以看出,它除了容器所需的基本特性外,還有其他許多附加特性,比如國際化的消息訪問、資源訪問、事件傳播、載入多個上下文等。
在這個接口體系中,ListableBeanFactory和HierarchicalBeanFactory兩個接口,連接BeanFactory接口定義和ApplicationConext應用上下文的接口定義。在ListableBeanFactory接口中,細化了許多BeanFactory的接口功能,比如定義了getBeanDefinitionNames()接口方法;對於HierarchicalBeanFactory接口,增加了getParentBeanFactory()的功能,是BeanFactory具備了雙親IoC容器的管理功能,在ConfigurableBeanFactory中主要定義了一些對BeanFactory的配置功能,比如通過setParentBeanFactory()設置雙親IoC容器,通過addBeanPostProcessor()定義了Bean後置處理器等。;對於ApplicationContext接口,它通過繼承MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory簡單IoC容器的基礎上添加了許多對高級容器的特性的支持。總體來說 ApplicationContext 必須要完成以下幾件事:
- 標識一個應用環境
- 利用BeanFactory 創建Bean 對象
- 保存對象關係表
- 能夠捕獲各種事件
下篇博客,將從ClassPathXmlApplicationContext線入手,對上面要做的幾件事,進行詳細解釋。