Spring Internals

spiing框架的核心組件的設計理念?有哪幾個核心組件?爲什麼需要這些組件?如何結合在一起的?spring的AOP特性如何利用這些基礎的核心組件工作的?spirng使用了哪些設計模式來完成它的設計?這種設計理念對軟件設計有何啓示?

 

1、In Action

(1)獲取spring源代碼。一般開源軟件都有工具進行源代碼管理,找到地址就可以下載了。如spring源代碼由svn管理,只要找到此svn地址,就可以下載了。最好是使用eclipse中的svn插件進行checkout。

(2)構建spring項目。

(3)spring源代碼發佈包中提供了一個應用實例。

ContextLoaderListener作用是在web環境中載入spring的IOC容器。


2、TIPS

(1)spring源代碼中的每個包都以一個相對獨立的子項目存在於代碼庫中。每個包都可以作爲獨立的項目導入到eclipse中。org.springframework.context是IOC容器的源代碼目錄。


(2)業務邏輯中領域對象的設計?

使用遠端調用實現分佈式處理?

使用ACEGI安全框架實現資源的安全需求?


(3)spring的設計目標:爲開發者提供一站式的輕量級應用開發平臺(框架)。spring抽象了我們在應用開發中遇到的共性問題。

對象-對象的關係——>對象-IOC容器-對象,完成了對象之間的關係解耦。


J2EE應用服務器是Java EE應用開發的平臺,這個平臺的設計都是從J2EE的技術規範出發的。

spring也是定位在企業應用中,和J2EE服務器一樣,起到一個應用平臺和開發框架的作用。


spring簡化了JAVA EE所進行的開發,即不需要在EJB這麼厚重的環境中使用Java EE的基本服務,爲應用開發提供了許多即開即用的系統組件和服務。

spring的設計理念:面向接口編程而不依賴於具體的產品實現。


(4)spring整體架構

spring IOC、spring AOP、spring MVC、spring JDBC/spring ORM、spring事務處理、spring遠端調用、spring應用。


(5)BeanFactory

BeanFactory提供的是最基本的IOC容器的功能。是IOC容器所應遵守的最基本的規範。

在spring中,所有的Bean都由BeanFactory進行管理。

BeanDefinition抽象了我們對Bean的定義。在計算機世界中,所有的功能都是建立在通過數據對現實進行抽象的基礎上的。

在spring中,實際將DefaultListableBeanFactory作爲一個默認的功能完整的IOC容器來使用的。可以以編程的方式使用DefaultListableBeanFactory(參考XmlBeanFactory的實現)。

Resource類是spring用來封裝IO操作的類。


以XmlBeanFactory的實現來了解簡單IOC容器的設計原理。


(6)ApplicationContext

ApplicationContext和BeanFactory相比,是一種面向框架餓使用風格,建議在開發應用時使用ApplicationContext作爲IOC容器的基本形式。

以FileSystemXmlApplicationContext的實現來了解ApplicationContext容器的設計原理。


(7)IOC的初始化過程

IOC容器的初始化由refresh()方法啓動,此方法標誌着IOC容器的正式啓動。啓動包括BeanDefinition的Resource定位、載入和註冊三個基本過程。

在spring IOC的設計中,Bean定義的載入和依賴注入是兩個獨立的過程。


3、PS

(1)spring管理數據持久化、事務處理、消息中間件、分佈式計算等抽象資源。

 

(2)spring框架分爲核心、組件和應用。

Spring框架的總體架構

spring的特性功能:      web     transaction  

                                   aop        jdbc    jmx      orm

spring核心組件:      Context              Beans

                                                     Core

Spring是面向bean的編程。spring將對象包裝在bean中而達到對對象管理。

 

框架的設計理念(設計策略):

構建一個數據結構,然後根據這個數據結構設計它的生存環境,並讓它在這個環境中按照一定的規律在不停的運動,在它們的不停運動中設計一系列與環境或者與其它個體完成信息交換。

 

三大核心組件如何協同工作:

Bean包裝的是Object,而Object必然有數據,如何給這些數據提供生存環境是Context要解決的問題。對Context來說,它要發現每個Bean之間的關係,爲它們建立這種關係並且要維護好這種關係。因此Context就是一個Bean關係的集合,這個關係集合又叫IoC容器。Core是發現、建立和維護每個Bean之間的關係所需要的一系列的工具。Core組件相當於Util組件。

 

每個組件內部類的層次關係,以及它們在運行時的時序順序。

 

一、Bean組件

Bean組件在org.springframework.beans包下。這個包下的所有類主要解決了三件事:Bean的定義、Bean的創建以及對Bean的解析。對使用者來說,唯一需要關心的就是Bean的創建,其它兩個由spring在內部幫你完成,對你來說是透明的。

 

Bean的創建是典型的工廠模式。頂級接口是BeanFactory。最終默認實現類是DefaultListableBeanFatory,它實現了所有接口。

爲什麼要定義這麼多層次的接口?——>每個接口都是它使用的場合。主要是爲了區分在spring內部在操作工作中對象的傳遞和轉化過程中,對對象的數據訪問所做的限制

這四個接口共同定義了Bean的集合、Bean之間的關係以及Bean行爲。

 

Bean的定義主要有BeanDefinition描述。Bean的定義完整的描述了在spring的配置文件中你定義的<bean/>節點中的信息,包括各種子節點。當spring成功解析你定義的一個<baen/>節點後,在spring的內部它就被轉化爲BeanDefinition對象,以後所有的操作都是對這個對象完成的。

 

Bean的解析主要就是對spring配置文件的解析。Bean的解析功能被分的很細,因爲這裏需要被擴展的地方很多,必須保證有足夠的靈活性,以應對可能的變化。

 

 二、Context組件

Context在org.springframework.context包下,它給spring提供一個運行時環境,用以保存各個對象的狀態。

AppliactionContext是Context的頂級父類。它繼承了5個接口。ApplicationContext繼承了ResourceLoader接口,使得ApplicationContext可以訪問到任何外部資源

AppliactionContext必須要完成以下幾件事:

a、標識一個應用環境;

b、利用BeanFactory創建Bean對象;

c、保存對象關係表;

d、能捕獲各種事件;

Context作爲spring的IOC容器,基本上整合了spring的大部分功能的基礎。

 

三、Core組件

Core包含了很多關鍵類,其中一個重要組成部分是定義了資源的訪問方式。把所有資源都抽象成一個接口

Resource接口封裝了各種可能的資源類型,對使用者來說屏蔽了文件類型的不同。Resource接口繼承了InputStreamSource接口,這樣所有的資源都可通過InputStream類獲取。資源的加載者要統一,由ResourceLoader接口完成,它屏蔽了所有的資源加載者的差異,只需要實現這個接口就可以加載所有的資源,默認實現是DefaultResourceLoader。

 

Context和Resource如何建立關係?——>Context把資源的加載、解析和描述工作委託給了ResourcePatternResolver類完成。它把資源的加載、解析和資源的定義整合在一起便於其它組件使用

 

IOC容器如何工作?——>從使用者角度看三大核心組件如何運行的?如何讓spring完成各種功能?spring到底有哪些功能?這些功能如何得來的?

IOC容器實際就是Context組件結合其它兩個組件共同構建了一個Bean關係網,如何構建這個關係網?——>構建的入口在AbstractApplicationContext類的refresh方法中。這個方法構建了整個IOC容器過程的完整的代碼。這段代碼包含以下幾個步驟:

a、構建BeanFactory,以便產生bean

b、註冊可能感興趣的事件

c、創建Bean實例對象

d、觸發被監聽的事件

 

一、如何創建BeanFactory工廠——>AbstractRefreshableApplicationContext.refreshBeanFactory方法說明了BeanFactory的創建過程。

二、如何創建Bean實例並構建Bean的關係網——>Bean的實例化,是從AbstractApplicationContext.finishBeanFactoryInitialization方法開始。

FactoryBean:spring一大半的擴展的功能都與其有關。是可以產生Bean實例的Bean。用戶可以在其getObject方法中定義如何產生實例對象

如何創建Bean實例對象以及如何構建Bean實例對象之間的關聯關係是spring中一個核心關鍵。

三、IOC容器的擴展點

如何讓Bean對象有一定的擴展性,就是可以加入用戶的操作。有哪些擴展點?spring是如何調用到這些擴展點的?——>對spring的IOC容器來說,主要有:BeanFactoryPostProcessor、BeanPostProcessor,它們分別是在構建BeanFactory和構建Bean對象時調用。InitializingBean和DisposableBean分別是在Bean實例創建和銷燬時被調用。用戶可以實現這些接口中定義的方法,spring會在適當的時候調用它們。

四、IOC容器如何爲我所用

spring能做什麼?spring的IOC容器能做什麼?——>使用spring首先必須要構建IOC容器,沒有它spring就無法工作。ApplicationContext.xml是IOC容器的默認配置文件。spring的所有特性都是基於這個IOC容器工作的。如AOP的實現就是spring本身實現了其擴展點來達到了它想要的特性功能。

 

spring中AOP特性詳解

一、spring AOP如何實現(這裏是jdk動態代理實現,當然spring還支持cglib類代理)

要實現代理類,在spring的配置文件中通常這樣定義一個Bean,如:
<bean id="testBean" class="org.springframework.aop.framework.ProxyFactoryBean"> 

             <property name="proxyInterfaces">

                      <value>org.springframework.aop.framework.PrototypeTargetTests$TestBean</value>

             </property>

             <property name="target"><ref local="testBeanTarget"></ref></property>

             <property name="singleton"><value>true</value></property>

             <property name="interceptorNames">

                               <list>

                                        <value>testInterceptor</value>

                                        <value>testInterceptor2</value>

                              </list>

             </property>

</bean>  

 配置上看到要設置被代理的接口、接口的實現類(目標類)、以及攔截器(在執行目標方法之前被調用)

Spring AOP也是實現其自身的擴展點來完成這個特性的。這個代理類繼承了FactoryBean的ProxyFactoryBean。FactoryBean可以讓你自定義對象的創建方法。代理對象要通過Proxy類動態生成。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章