Spring的設計理念:
Spring的核心組件:bean 、context、core,這三個中最核心的是bean,bean就像舞臺的演員一樣,context就像背景一樣,core就像道具一樣。Sping 解決的關鍵問題就是如何管理這些bean,spring把對象包裹在bean中達到對對象的管理和一些額外操作,把對象之間的依賴關係轉而用配置文件來管理,就是它的依賴注入機制,這個依賴注入關係在一個叫做IOC的容器中進行管理。Spring構建一個數據結構,根據這個數據結構設計它的生存環境context,並讓它在這個生存環境中不停的發現、建立、維護bean之間的關係,context就是一個bean關係的集合,這個關係的集合就叫做IOC容器。Core就是發現、建立、維護每個bean之間關係所需要的一系列工具。這就是spring的設計理念。
Bean組件:
(1) bean組件主要解決三件事:定義、創建、解析bean,bean是工廠模式beanfactory創建的,bean主要由beanDefinition定義描述的,bean的解析主要是對spring配置文件解析。
beanfactory是頂級接口,他的三個子類ListableBeanFactory、HierarchicalBeanFactory、AutoAireCapableBeanFactory。他們最終的默認實現類是DefaultListableBeanFactory,它實現的所有的接口。每個接口都有它使用的場合,主要是區分spring內部對象的傳遞和轉化過程中對對象的數據訪問所作的限制。ListableBeanFactory 接口表示這些 Bean 是可列
HierarchicalBeanFactory 表示Bean 是有繼承關係的,AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規則。
(3)bean的定義就是完整的描述spring配置文件中節點的所有信息。Spring成功解析配置文件定義的節點後, spring內部就將它轉化爲beandefinition對象,以後所有的操作都是對這個對象完成的。
Context組件
Context就是給spring提供一個運行時環境,以保存各個對象的狀態,context環境的構建。
(1) context繼承了5個接口,用於擴展context的功能。繼承beanFactory,容器的運行主體對象是bean,beanfactory用於創建bean。ApplicationContext繼承了resourceLoader, ,使得 ApplicationContext 可以訪問到任何外部資源。
(2)ApplicationContext 的子類主要包含兩個方面:configurableApplicationContext說明context是可修改的,用戶可以動態的添加修改已有的配置信息,他下面的多個子類:
其中最經常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 類。
WebApplicationContext 顧名思義,就是爲 web 準備的 Context 他可以直接訪問到 ServletContext,通常情況下,這個接口使用的少。
(3)application要做的事情:標識一個應用環境,利用beanfactory創建bean對象,保存對象的關係表,能夠捕獲各種事件。
Core 是spring的演出時的道具,看看這個道具:
(1) resource接口封裝了各種可能的資源類型,對使用者來說屏蔽了文件類型的不同。Resource繼承了inputStreamSource接口,這個接口提供了getInputStreamSource方法,返回inputStream類,所有的資源都可以通過inputStream類獲得,屏蔽了資源提供者。資源的加載也是通過ResourceLoader接口完成的,屏蔽了資源的加載者,他的默認實現類defaultResourceLoader.
(2) Context資源的加載、解析、描述工作委託給了ResourcePatternResolver類來完成,他把資源的加載、解析和定義整合在一起便於其他組件使用。
IOC容器的構建:
IOC容器就是context組件結合其他兩個組件構成bean的關係網,構建的入口就是abstractApplicationContext的refresh入口。步驟:註冊可能感興趣的事件;創建bean的實例對象;觸發被監聽的事件
(1) 創建和配置beanFactory,通過AbstractRefreshableApplicationContext. refreshBeanFactory 方法創建更新beanfactory,beanFactory已存在就更新,如果沒有就創建.loadBeanDefinitions(beanFactory)把用戶自定義的數據結構轉化爲IOC容器特定的數據結構。
(2) 創建好 BeanFactory 後,接下去添加一些 Spring 本身需要的一些工具類,這個操作在 AbstractApplicationContext 的 prepareBeanFactory 方法完成。