Spring核心容器(Core Spring container)
容器是Spring框架最核心的部分,它管理着Spring應用中bean的創建、配置和管理。在該模塊中,包括了Spring bean工廠,它為Spring提供了DI的功能。基於bean工廠,我們還會發現有多種Spring應用上下文的實現。還提供了許多企業服務。
所有的Spring模塊都構建於核心容器之上。
面向切面編程(AOP)
Spring對面向切面編程提供了豐富的支持。這個模塊是Spring應用系統中開發切面的基礎,與DI一樣,AOP可以幫助應用對象解耦。
數據訪問與集成(Data access & integration)
Spring的JDBC和DAO模塊封裝了大量樣板代碼,這樣可以使得數據庫代碼變得簡潔,也可以更專注於我們的業務,還可以避免數據庫資源釋放失敗而引起的問題。
另外,Spring AOP為數據訪問提供了事務管理服務,同時Spring還對ORM進行了集成,如Hibernate、MyBatis等。
Web與遠程調用(Web and remoting)
該模塊提供了SpringMVC框架給Web應用,還提供了多種構建和其它應用交互的遠程調用方案。
SpringMVC框架在Web層提升了應用的松耦合水平。
Instrumentation
該模塊提供了為JVM添加代理(agent)的功能。具體來講,就是為Tomcat提供了一個織入代理,能夠為Tomcat傳遞類文件,就像這些類文件是被類加載器加載的一樣。
測試(Test)
為了使得開發者能夠很方便的進行測試,Spring提供了測試模塊以致力於Spring應用的測試。
通過該模塊,Spring為使用Servlet、JNDI等編寫單元測試提供了一系列的mock對象實現。
我們主要來看看Spring的骨骼架構和核心組件~
(一)Spring的骨骼架構
1 ---Spring框架 2 |---Spring的特性功能 3 |---Web 4 |---Transaction 5 |---AOP 6 |---JDBC 7 |---JMX 8 |---Orm 9 |---...... 10 |---Spring骨骼架構 11 |---核心組件Context 12 |---核心組件Bean 13 |---核心組件Core
Core、Context、Bean構建起了整個Spring的骨骼架構,沒有它們就不可能有AOP、Web等上層的特性功能。
Spring的設計理念
如果要在三個核心組件中選出核心,那就是Bean組件,其實Spring就是面向Bean的編程(BOP,Bean Oriented Programming)。
我們用Spring的原因是什么?
Spring解決了一個非常關鍵的問題,它可以讓我們把對象之間的依賴關系轉而用配置文件來管理,也就是它的依賴注入機制。而這個注入關系在一個叫IOC的容器中進行管理。
IOC又是什么?
IOC是控制反轉(Inversion of Control),是被Bean包裹的對象。Spring正是通過把對象包裝在Bean中從而達到管理這些對象及做一系列額外操作的目的。
這種設計策略完全類似於Java實現OOP的設計理念,構建一個數據結構,然后根據這個數據結構設計它的生存環境,並讓它在這個環境中按照一定的規律不停地運動, 在它們的不停運動中設計一個系列與環境或者與其他個體完成信息交換。
核心組件是如何進行協同工作的呢?
前面說Bean是Spring中的最核心,那么把Bean比作一場演出中的演員,Context就是舞台背景,Core就是演出的道具。只有三者一起才能具備演一場好戲的條件。當然,想要演出足夠精彩,還要有Spring提供的特色功能。
Bean包裝的是Object,Object必然有數據,如何給這些數據提供生存環境就是Context要解決的問題。Context要發現每個Bean之間的關系,為它們建立這種關系並且維護好這種關系。所以Context就是一個Bean關系的集合,這個集合又叫做IOC容器,建立起IOC容器,Spring就可以開始為我們工作了。
Core是發現、建立和維護每個Bean之間的關系所需要的一系列工具,也可以叫它Util(多用途的、工具性質的包)。
(二)核心組件詳解
Bean組件
Bean組件在Spring的org.springframework.beans包下。這個包下的所有類主要解決3件事情:Bean的定義、Bean的創建及對Bean的解析。我們只需要關心它的創建就好了,其他兩個由Spring在內部幫我們完成,我們是看不見的。
Spring Bean的創建是典型的工廠模式,它的頂級接口是BeanFactory。
Bean的定義主要由BeanDefinition描述。它的定義完整地描述了在Spring的配置文件中我們定義的< bean/>節點中所有的信息,包括各種子節點。當Spring成功解析我們定義的一個< bean/>節點后,在Spring的內部它就被轉化成BeanDefinition對象,以后所有的操作都是對這個對象進行的。
Bean的解析主要就是對Spring配置文件的解析。
Context組件
Context組件在Spring的org.springframework.context包下。
ApplicationContext是Context的頂級父類。
ApplicationContext繼承了BeanFactory,這也說明Spring容器中國運行的主體對象是Bean。
ApplicationContext繼承了ResourseLoader接口,使其可以訪問到任何外部資源。
ApplicationContext必須要完成的幾件事情:
- 標識一個應用環境
- 利用BeanFactory創建Bean對象
- 保存對象關系表
- 能夠捕獲各種事件
Context作為Spring的IOC容器,基本上整合了Spring的大部分功能。
Core組件
Core組件包含了很多關鍵類,一個重要的組成部分就是定義了資源的訪問方式。
Resource接口封裝了各種可能的資源類型,也就是對使用者來說屏蔽了文件類型的不同。
Resource接口繼承了InputStreamSource接口,這樣所有的資源都可以通過InputStream類來獲取,所以也屏蔽了資源的提供者。
加載資源的任務是由ResourceLoader接口完成的,它屏蔽了所有的資源加載者的差異。
Context把資源的加載、解析和描述工作委托給了ResourcePatternResolver類來完成,它相當於一個接頭人,把資源的加載、解析和資源的定義整合在一起便於其他組件使用。
IOC容器是如何工作的?
IOC容器實際上是Context組件結合其他兩個組件共同構建了一個Bean關系網。
把IOC容器比作一個箱子,在這個箱子里有若干個球的模子,可以用這些模子來制造很多種不同的球,還有一個制造這些球模的機器,這個機器可以產生球模。那么它們的對應關系就是BeanFactory,即那個制造球模的機器,球模就是Bean,制造出來的球就是Bean的實例。
BeanFactoryPostProcessor對應到當造球模被造出來時,有機會對其做出適當的修正,即它可以幫我們修改球模。InitializingBean和DisposableBean是在球模造球的開始和結束階段,我們可以完成一些預備和掃尾工作。BeanPostProcessor可以讓我們對球模造出來的球做出適當的修正。
最后還有一個FactoryBean,它可是一個神奇的球模。這個球模不是預先就定型的,而是由你來確定它的形狀。這樣在這個箱子里可以發現所有我們想要的球。
--------------------
作者:SillyDuckkk
來源:CSDN
原文:https://blog.csdn.net/hxllhhy/article/details/79900264