1. 程式人生 > >Spring框架的設計理念

Spring框架的設計理念

streams init cep tlist con fresh 包含 部分 put

Spring 的骨骼架構:

Spring 框架中的核心組件:Core、Context 和 Beans。沒有它們就不可能有 AOP、Web 等上層的特性功能。 技術分享圖片 Spring 的設計理念: Bean 在 Spring 中才是真正的主角。Bean 在 Spring 中作用就像 Object 對 OOP 的意義一樣,沒有對象的概念就像沒有面向對象編程,Spring 中沒有 Bean 也就沒有 Spring 存在的意義。就像一次演出舞臺都準備好了但是卻沒有演員一樣。Spring 解決了一個非常關鍵的問題他可以讓你把對象之間的依賴關系轉而用配置文件來管理,也就是他的依賴註入機制。而這個註入關系在一個叫 Ioc 容器中管理,那 Ioc 容器中有又是什麽就是被 Bean 包裹的對象。Spring 正是通過把對象包裝在 Bean 中而達到對這些對象管理以及一些列額外操作的目的。 核心組件如何協同工作:
前面把Bean 比作一場演出中的演員的話,那Context 就是這場演出的舞臺背景,而Core 應該就是演出的道具了。只有他們在一起才能具備能演出一場好戲的最基本的條件。當然有最基本的條件還不能使這場演出脫穎而出,還要他表演的節目足夠的精彩,這些節目就是 Spring 能提供的特色功能了。 我們知道Bean包裝的是Object,而Object 必然有數據,如何給這些數據提供生存環境就是 Context 要解決的問題,對 Context 來說他就是要發現每個Bean之間的關系,為它們建立這種關系並且要維護好這種關系。所以 Context 就是一個 Bean 關系的集合,這個關系集合又叫 Ioc 容器,一旦建立起這個 Ioc 容器後 Spring 就可以為你工作了。那 Core 組件又有什麽用武之地呢?其實 Core 就是發現、建立和維護每個 Bean 之間的關系所需要的一些列的工具,從這個角度看來,Core 這個組件叫 Util 更能讓你理解。 技術分享圖片
核心組件詳解: Bean 組件 Bean 組件在 Spring 的 org.springframework.beans 包下。這個包下的所有類主要解決了三件事:Bean 的定義、Bean 的創建以及對 Bean 的解析。對 Spring 的使用者來說唯一需要關心的就是 Bean 的創建,其他兩個由 Spring 在內部幫你完成了,對你來說是透明的。 Spring Bean 的創建時典型的工廠模式,他的頂級接口是 BeanFactory,下圖是這個工廠的繼承層次關系: 技術分享圖片 BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。 但是從上圖中我們可以發現最終的默認實現類是 DefaultListableBeanFactory,他實現了所有的接口。 每個接口都有他使用的場合,它主要是為了區分在 Spring 內部在操作過程中對象的傳遞和轉化過程中,對對象的數據訪問所做的限制。例如 ListableBeanFactory 接口表示這些 Bean 是可列表的
,而 HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關系的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規則。 這四個接口共同定義了 Bean 的集合、Bean 之間的關系、以及 Bean 行為。 Bean 的定義主要有 BeanDefinition 描述,下圖說明了這些類的層次關系: 技術分享圖片 Bean 的定義就是完整的描述了在 Spring 的配置文件中你定義的 <bean/> 節點中所有的信息,包括各種子節點。 當 Spring 成功解析你定義的一個 <bean/> 節點後,在 Spring 的內部他就被轉化成 BeanDefinition 對象。 以後所有的操作都是對這個對象完成的。 技術分享圖片 Context 組件 Context 在 Spring 的 org.springframework.context 包下,實際上就是給 Spring 提供一個運行時的環境,用以保存各個對象的狀態。 ApplicationContext 是 Context 的頂級父類,他除了能標識一個應用環境的基本信息外,他還繼承了五個接口,這五個接口主要是擴展了 Context 的功能。下面是 Context 的類結構圖:http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/origin_image006.png 技術分享圖片

可以看出 ApplicationContext 繼承了 BeanFactory,這也說明了 Spring 容器中運行的主體對象是 Bean,另外 ApplicationContext 繼承了 ResourceLoader 接口,使得 ApplicationContext 可以訪問到任何外部資源ApplicationContext 的子類主要包含兩個方面:
  • ConfigurableApplicationContext 表示該 Context 是可修改的,也就是在構建 Context 中用戶可以動態添加或修改已有的配置信息,它下面又有多個子類,其中最經常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 類。
  • WebApplicationContext 顧名思義,就是為 web 準備的 Context 他可以直接訪問到 ServletContext,通常情況下,這個接口使用的少。
  • 再往下分就是按照構建 Context 的文件類型,接著就是訪問 Context 的方式。這樣一級一級構成了完整的 Context 等級層次。
ApplicationContext 必須要完成以下幾件事:
  • 標識一個應用環境
  • 利用 BeanFactory 創建 Bean 對象
  • 保存對象關系表
  • 能夠捕獲各種事件
  • Context 作為 Spring 的 Ioc 容器,基本上整合了 Spring 的大部分功能,或者說是大部分功能的基礎。
Core組件: Core 組件其中一個重要組成部分就是定義了資源的訪問方式。這種把所有資源都抽象成一個接口的方式很值得在以後的設計中拿來學習。 http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/origin_image007.png 技術分享圖片 可以看出 Resource 接口封裝了各種可能的資源類型,也就是對使用者來說屏蔽了文件類型的不同。 對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到 Resource 接口繼承了 InputStreamSource 接口,這個接口中有個 getInputStream 方法,返回的是 InputStream 類。這樣所有的資源都被可以通過 InputStream 這個類來獲取,所以也屏蔽了資源的提供者。另外還有一個問題就是加載資源的問題,也就是資源的加載者要統一,從上圖中可以看出這個任務是由 ResourceLoader 接口完成,他屏蔽了所有的資源加載者的差異,只需要實現這個接口就可以加載所有的資源,他的默認實現是 DefaultResourceLoader。

Context 和 Resource 的類關系圖:

技術分享圖片 Context 是把資源的加載、解析和描述工作委托給了 ResourcePatternResolver 類來完成,他相當於一個接頭人,他把資源的加載、解析和資源的定義整合在一起便於其他組件使用。

Spring框架的設計理念