您好,登錄后才能下訂單哦!
一. Spring IOC 原理
1. 概念
Spring 通過一個配置文件描述 Bean 及 Bean 之間的依賴關(guān)系,利用 Java 語言的反射功能實(shí)例化Bean 并建立 Bean 之間的依賴關(guān)系。 Spring 的 IoC 容器在完成這些底層工作的基礎(chǔ)上,還提供了 Bean 實(shí)例緩存、生命周期管理、 Bean 實(shí)例代理、事件發(fā)布、資源裝載等高級服務(wù)。
2. Spring 容器高層視圖
Spring 啟動時讀取應(yīng)用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相應(yīng)的 Bean 配置注冊表,然后根據(jù)這張注冊表實(shí)例化 Bean,裝配好 Bean 之間的依賴關(guān)系,為上層應(yīng)用提供準(zhǔn)備就緒的運(yùn)行環(huán)境。其中 Bean 緩存池為 HashMap 實(shí)現(xiàn)
3. IOC 容器實(shí)現(xiàn)
BeanFactory-框架基礎(chǔ)設(shè)施
BeanFactory 是 Spring 框架的基礎(chǔ)設(shè)施,面向 Spring 本身;ApplicationContext 面向使用Spring 框架的開發(fā)者,幾乎所有的應(yīng)用場合我們都直接使用 ApplicationContext 而非底層的 BeanFactory。
BeanDefinitionRegistry 注冊表
(1). Spring 配置文件中每一個節(jié)點(diǎn)元素在 Spring 容器里都通過一個 BeanDefinition 對象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注冊BeanDefinition 對象的方法。
BeanFactory 頂層接口
(2). 位于類結(jié)構(gòu)樹的頂端 ,它最主要的方法就是 getBean(String beanName),該方法從容器中返回特定名稱的 Bean,BeanFactory 的功能通過其他的接口得到不斷擴(kuò)展:
ListableBeanFactory
(3). 該接口定義了訪問容器中 Bean 基本信息的若干方法,如查看 Bean 的個數(shù)、獲取某一類型Bean 的配置名、查看容器中是否包括某一 Bean 等方法;
HierarchicalBeanFactory 父子級聯(lián)
(4). 父子級聯(lián) IoC 容器的接口,子容器可以通過接口方法訪問父容器; 通過HierarchicalBeanFactory 接口, Spring 的 IoC 容器可以建立父子層級關(guān)聯(lián)的容器體系,子容器可以訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean。Spring 使用父子容器實(shí)現(xiàn)了很多功能,比如在 Spring MVC 中,展現(xiàn)層 Bean 位于一個子容器中,而業(yè)務(wù)層和持久層的 Bean 位于父容器中。這樣,展現(xiàn)層 Bean 就可以引用業(yè)務(wù)層和持久層的 Bean,而業(yè)務(wù)層和持久層的 Bean 則看不到展現(xiàn)層的 Bean。
ConfigurableBeanFactory
(5). 是一個重要的接口,增強(qiáng)了 IoC 容器的可定制性,它定義了設(shè)置類裝載器、屬性編輯器、容器初始化后置處理器等方法;
AutowireCapableBeanFactory 自動裝配
(6). 定義了將容器中的 Bean 按某種規(guī)則(如按名字匹配、按類型匹配等)進(jìn)行自動裝配的方法;
SingletonBeanRegistry 運(yùn)行期間注冊單例 Bean
(7). 定義了允許在運(yùn)行期間向容器注冊單實(shí)例 Bean 的方法;對于單實(shí)例( singleton)的 Bean來說,BeanFactory 會緩存 Bean 實(shí)例,所以第二次使用 getBean() 獲取 Bean 時將直接從IoC 容器的緩存中獲取 Bean 實(shí)例。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個用于緩存單實(shí)例 Bean 的緩存器,它是一個用 HashMap 實(shí)現(xiàn)的緩存器,單實(shí)例的 Bean 以beanName 為鍵保存在這個 HashMap 中。
依賴日志框框
(8). 在初始化 BeanFactory 時,必須為其提供一種日志框架,比如使用 Log4J, 即在類路徑下提供 Log4J 配置文件,這樣啟動 Spring 容器才不會報錯。
二.ApplicationContext 面向開發(fā)應(yīng)用
ApplicationContext 由 BeanFactory 派生而來,提供了更多面向?qū)嶋H應(yīng)用的功能。
ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基礎(chǔ)上,還通過多個其他的接口擴(kuò)展了 BeanFactory 的功能:
1. ClassPathXmlApplicationContext:默認(rèn)從類路徑加載配置文件
2. FileSystemXmlApplicationContext:默認(rèn)從文件系統(tǒng)中裝載配置文件
3. ApplicationEventPublisher:讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件、關(guān)閉事件等。
4. MessageSource:為應(yīng)用提供 i18n 國際化消息訪問的功能;
5. ResourcePatternResolver : 所 有 ApplicationContext 實(shí)現(xiàn)類都實(shí)現(xiàn)了類似于PathMatchingResourcePatternResolver 的功能,可以通過帶前綴的 Ant 風(fēng)格的資源文件路徑裝載 Spring 的配置文件。
6. LifeCycle:該接口是 Spring 2.0 加入的,該接口提供了 start()和 stop()兩個方法,主要用于控制異步處理過程。在具體使用時,該接口同時被 ApplicationContext 實(shí)現(xiàn)及具體Bean 實(shí)現(xiàn), ApplicationContext 會將 start/stop 的信息傳遞給容器中所有實(shí)現(xiàn)了該接口的 Bean,以達(dá)到管理和控制 JMX、任務(wù)調(diào)度等目的。
7. ConfigurableApplicationContext 擴(kuò)展于 ApplicationContext,它新增加了兩個主要的方法: refresh()和 close(),讓 ApplicationContext 具有啟動、刷新和關(guān)閉應(yīng)用上下文的能力。在應(yīng)用上下文關(guān)閉的情況下調(diào)用 refresh()即可啟動應(yīng)用上下文,在已經(jīng)啟動的狀態(tài)下,調(diào)用 refresh()則清除緩存并重新裝載配置信息,而調(diào)用 close()則可關(guān)閉應(yīng)用上下文。
三.WebApplication 體系架構(gòu)
WebApplicationContext 是專門為 Web 應(yīng)用準(zhǔn)備的,它允許從相對于 Web 根目錄的路徑中裝載配置文件完成初始化工作。從 WebApplicationContext 中可以獲得ServletContext 的引用,整個 Web 應(yīng)用上下文對象將作為屬性放置到 ServletContext中,以便 Web 應(yīng)用環(huán)境可以訪問 Spring 應(yīng)用上下文。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。