一. Spring IOC 原理緩存
1. 概念架構
Spring 經過一個配置文件描述 Bean 及 Bean 之間的依賴關係,利用 Java 語言的反射功能實例化Bean 並創建 Bean 之間的依賴關係。 Spring 的 IoC 容器在完成這些底層工做的基礎上,還提供了 Bean 實例緩存、生命週期管理、 Bean 實例代理、事件發佈、資源裝載等高級服務。框架
2. Spring 容器高層視圖異步
Spring 啓動時讀取應用程序提供的 Bean 配置信息,並在 Spring 容器中生成一份相應的 Bean 配置註冊表,而後根據這張註冊表實例化 Bean,裝配好 Bean 之間的依賴關係,爲上層應用提供準備就緒的運行環境。其中 Bean 緩存池爲 HashMap 實現編輯器
3. IOC 容器實現3d
BeanFactory-框架基礎設施代理
BeanFactory 是 Spring 框架的基礎設施,面向 Spring 自己;ApplicationContext 面向使用Spring 框架的開發者,幾乎全部的應用場合咱們都直接使用 ApplicationContext 而非底層的 BeanFactory。日誌
BeanDefinitionRegistry 註冊表cdn
(1). Spring 配置文件中每個節點元素在 Spring 容器裏都經過一個 BeanDefinition 對象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工註冊BeanDefinition 對象的方法。對象
BeanFactory 頂層接口
(2). 位於類結構樹的頂端 ,它最主要的方法就是 getBean(String beanName),該方法從容器中返回特定名稱的 Bean,BeanFactory 的功能經過其餘的接口獲得不斷擴展:
ListableBeanFactory
(3). 該接口定義了訪問容器中 Bean 基本信息的若干方法,如查看 Bean 的個數、獲取某一類型Bean 的配置名、查看容器中是否包括某一 Bean 等方法;
HierarchicalBeanFactory 父子級聯
(4). 父子級聯 IoC 容器的接口,子容器能夠經過接口方法訪問父容器; 經過HierarchicalBeanFactory 接口, Spring 的 IoC 容器能夠創建父子層級關聯的容器體系,子容器能夠訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean。Spring 使用父子容器實現了不少功能,好比在 Spring MVC 中,展示層 Bean 位於一個子容器中,而業務層和持久層的 Bean 位於父容器中。這樣,展示層 Bean 就能夠引用業務層和持久層的 Bean,而業務層和持久層的 Bean 則看不到展示層的 Bean。
ConfigurableBeanFactory
(5). 是一個重要的接口,加強了 IoC 容器的可定製性,它定義了設置類裝載器、屬性編輯器、容器初始化後置處理器等方法;
AutowireCapableBeanFactory 自動裝配
(6). 定義了將容器中的 Bean 按某種規則(如按名字匹配、按類型匹配等)進行自動裝配的方法;
SingletonBeanRegistry 運行期間註冊單例 Bean
(7). 定義了容許在運行期間向容器註冊單實例 Bean 的方法;對於單實例( singleton)的 Bean來講,BeanFactory 會緩存 Bean 實例,因此第二次使用 getBean() 獲取 Bean 時將直接從IoC 容器的緩存中獲取 Bean 實例。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個用於緩存單實例 Bean 的緩存器,它是一個用 HashMap 實現的緩存器,單實例的 Bean 以beanName 爲鍵保存在這個 HashMap 中。
依賴日誌框框
(8). 在初始化 BeanFactory 時,必須爲其提供一種日誌框架,好比使用 Log4J, 即在類路徑下提供 Log4J 配置文件,這樣啓動 Spring 容器纔不會報錯。
二.ApplicationContext 面向開發應用
ApplicationContext 由 BeanFactory 派生而來,提供了更多面向實際應用的功能。
ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基礎上,還經過多個其餘的接口擴展了 BeanFactory 的功能:
1. ClassPathXmlApplicationContext:默認從類路徑加載配置文件
2. FileSystemXmlApplicationContext:默認從文件系統中裝載配置文件
3. ApplicationEventPublisher:讓容器擁有發佈應用上下文事件的功能,包括容器啓動事件、關閉事件等。
4. MessageSource:爲應用提供 i18n 國際化消息訪問的功能;
5. ResourcePatternResolver : 所 有 ApplicationContext 實現類都實現了相似於PathMatchingResourcePatternResolver 的功能,能夠經過帶前綴的 Ant 風格的資源文件路徑裝載 Spring 的配置文件。
6. LifeCycle:該接口是 Spring 2.0 加入的,該接口提供了 start()和 stop()兩個方法,主要用於控制異步處理過程。在具體使用時,該接口同時被 ApplicationContext 實現及具體Bean 實現, ApplicationContext 會將 start/stop 的信息傳遞給容器中全部實現了該接口的 Bean,以達到管理和控制 JMX、任務調度等目的。
7. ConfigurableApplicationContext 擴展於 ApplicationContext,它新增長了兩個主要的方法: refresh()和 close(),讓 ApplicationContext 具備啓動、刷新和關閉應用上下文的能力。在應用上下文關閉的狀況下調用 refresh()便可啓動應用上下文,在已經啓動的狀態下,調用 refresh()則清除緩存並從新裝載配置信息,而調用 close()則可關閉應用上下文。
三.WebApplication 體系架構
WebApplicationContext 是專門爲 Web 應用準備的,它容許從相對於 Web 根目錄的路徑中裝載配置文件完成初始化工做。從 WebApplicationContext 中能夠得到ServletContext 的引用,整個 Web 應用上下文對象將做爲屬性放置到 ServletContext中,以便 Web 應用環境能夠訪問 Spring 應用上下文。