一澎埠、概念
Spring通過一個配置文件描述Bean及Bean之間的依賴關(guān)系。利用Java語言的反射功能實(shí)例化Bean并建立Bean之間的關(guān)系始藕。Spring的IoC容器在完成這些底層工作的基礎(chǔ)上蒲稳,還提供了Bean實(shí)例緩存、生命周期管理伍派、Bean實(shí)例代碼弟塞、事件發(fā)布、資源裝載等高級服務(wù)拙已。
IoC(Inversion of Control)
“控制反轉(zhuǎn)”决记,創(chuàng)建對象的權(quán)利,由程序員反轉(zhuǎn)給了Spring容器倍踪。用來管理對象的實(shí)例化和初始化系宫,以及對象從創(chuàng)建到銷毀的整個生命周期。這些對象統(tǒng)稱為Spring Bean,即Java對象建车,與new出來的對象一樣扩借。
- 誰控制誰
IoC 容器控制了對象。 - 控制什么
主要是外部資源獲取缤至。 - 為何反轉(zhuǎn)
由容器查找及注入依賴對象潮罪,對象只是被動的接受依賴對象。 - 哪些方面反轉(zhuǎn)
依賴對象的獲取领斥。
傳統(tǒng)創(chuàng)建對象的過程嫉到,如圖:
IOC/DI容器創(chuàng)建對象:
二、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)细层。
三、IOC容器實(shí)現(xiàn)
IoC的實(shí)現(xiàn)唬涧,必須依賴DI疫赎,因?yàn)镮oC只是負(fù)責(zé)對象的創(chuàng)建,而對象創(chuàng)建過程中需要將對象與對象的依賴進(jìn)行實(shí)現(xiàn)碎节。此時使用到的就是DI(Dependency Injection捧搞,依賴注入,它必須依賴于IoC)。
Spring 通過讀取 XML 或 Java 注解中的信息來獲取哪些對象需要實(shí)例化实牡。
Spring 提供 2 種不同類型的 IoC 容器陌僵,即 BeanFactory 和 ApplicationContext 容器轴合。
BeanFactory(簡述)
BeanFactory是Spring框架的基礎(chǔ)設(shè)施,面向Spring本身创坞。
BeanFactory繼承體系
- BeanDefinitionRegistry 注冊表
Spring配置文件中每一個節(jié)點(diǎn)元素在Spring容器里都通過一個BeanDefinition對象表示,它描述了Bean的配置信息受葛。而BeanDefinitionRegistry接口提供了向容器手工注冊BeanDefinition對象的方法题涨。 - BeanFactory頂層接口
位于類結(jié)構(gòu)樹頂端,它最主要的方法就是getBean(String beanName),該方法從容器中返回特定名稱的Bean,BeanFactory的功能通過其他的接口得到不斷的擴(kuò)展总滩。 - ListableBeanFactory
該接口定義了訪問容器中Bean基本信息的若干方法纲堵,如查看Bean的個數(shù)、獲取某一類型Bean的配置名闰渔、查看容器中是否包括某一Bean等方法席函。 - HierarchicalBeanFactory父子級聯(lián)
父子級聯(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
一個重要接口录煤,增強(qiáng)了IOC容器的可定制性,它定義了設(shè)置類裝載器荞胡、屬性編輯器辐赞、容器初始化后置處理器等方法。 - AutowireCapableBeanFactory自動裝配
定義了將容器中的Bean按某種規(guī)則(如按名字匹配硝训、按類型匹配等)進(jìn)行自動裝配的方法响委。 - SingletonBeanRegistry運(yùn)行期間注冊單例Bean
定義了允許在運(yùn)行期間向容器注冊單實(shí)例Bean的方法;
對于單實(shí)例(singleton)的Bean來說窖梁,BeanFactory會緩存Bean實(shí)例赘风,所以第二次使用getBean()獲取Bean時將直接從IOC容器的緩存中獲取Bean是來。Spring在DefaultSingletonBeanRegistry類中提供了一個用于緩存單實(shí)例Bean的緩存器纵刘,它是一個用HashMap實(shí)現(xiàn)的緩存器邀窃,單實(shí)例的Bean以beanName為鍵保存在這個HashMap中。 - 依賴日志框架
在初始化BeanFactory時,必須為其提供一種日志框架瞬捕,如Log4J,即在類路徑下提供Log4J配置文件鞍历,這樣啟動Spring容器才不會報(bào)錯。
ApplicationContext(簡述)
ApplicationContext面向使用Spring框架的開發(fā)者肪虎,幾乎所有的應(yīng)用場合我們都直接使用ApplicationContext而非底層的BeanFactory劣砍。
ApplicationContext 由 BeanFactory 派 生 而 來 , 提 供 了 更 多 面 向 實(shí) 際 應(yīng) 用 的 功 能 扇救。ApplicationContext 繼承了 HierarchicalBeanFactory和ListableBeanFactory 接口刑枝,在此基礎(chǔ)上,還通過多個其他的接口擴(kuò)展了BeanFactory 的功能
- ClassPathXmlApplicationContext:默認(rèn)從類路徑加載配置文件迅腔。
- FileSystemXmlApplicationContext:默認(rèn)從文件系統(tǒng)中裝載配置文件装畅。
- ApplicationEventPublisher:讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件沧烈、關(guān)閉事件等掠兄。
- MessageSource:為應(yīng)用提供 i18n 國際化消息訪問的功能。
- ResourcePatternResolver : 所 有 ApplicationContext 實(shí)現(xiàn)類都實(shí)現(xiàn)了類似于PathMatchingResourcePatternResolver 的功能锌雀,可以通過帶前綴的 Ant 風(fēng)格的資源文件路徑裝載 Spring 的配置文件蚂夕。
- 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)度等目的柬泽。
- 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體系結(jié)構(gòu)
WebApplicationContext是專門為Web應(yīng)用準(zhǔn)備的包警,它允許從相對于Web根目錄的路徑中裝載配置文件完成初始化工作撵摆。從WebApplicationContext中可獲得ServletContext的引用,整個Web應(yīng)用上下文對象將作為屬性放置到ServletContext中害晦,以便Web應(yīng)用環(huán)境可訪問Spring應(yīng)用上下文特铝。