所讀文章
常用Flex IOC框架比較分析 http://www.infoq.com/cn/articles/ioc-frameworks
Flex 與 Spring 框架 http://www.riameeting.com
Spring BlazeDS Integration簡介與入門 http://www.infoq.com/cn/articles/spring-blazeds-integration
Spring與IOC現在是開發人員的常識了,IOC(Inversion of Control)也成為軟件開發中非常流行的一種設計模式。
Spring的橫空出世完全顛覆了傳統Java服務端的開發方式。它鼓勵通過依賴注入的方式來裝配POJO,這極大地簡化了應用的開發與測試。
Spring的核心配置是通過Java bean實現的。借助于bean,任何Java類都能被公開成為服務。
IoC是Spring的核心。IoC的作用:
借助IOC,可用一個獨立的對象為其他對象的數據成員填充正確的實現,而不是由這些對象自己負責此項工作。這樣做的好處有兩個。
第一,可將對象的數據成員
聲明為接口,從而將對象與其具體實現分離(即契約式設計,design by
contract)。
第二,可從對象中刪除創建邏輯,可以使對象的用途更為明確。
實現:
一般有兩種最常見的對象配置方法:
- 對象實例化(例如:
var myObject = new Object()
)
- 對象查找(例如:
var myObject = registry.getMyObject()
)
而利用IOC,你可在一個獨立層中實例化應用程序要用到的對象,并傳入它們所需的依賴。具體來說,最常見的實現方法也有兩種:
- Setter注入(例如:
instance.myObject = new Object()
)
- Constructor注入(例如:
instance = new Instance( new Object() )
)
一個IOC框架,通常由如下三個部分組成:配置、工廠和注入機制。
配置
我們可以在配置中描述對象之間的關系。最常用的配置描述方法是在文件中聲明。這樣的文件有時候也被稱為上下文文件(context file)。也可以用元數據/注釋(metadata/annotation),甚至直接在程序中描述配置。/
工廠
工廠負責配置的解析和所有對象的準備工作,程序一旦運行,就可以根據需要取得這些對象。
在經典的Spring框架(最流行的Java IOC框架)中,所有對象(我稱其為客戶對象)都由IOC容器負責準備,并且它們以接口形式聲明自己的依賴。在配置文件中,被聲明的依賴都被設置為對應的實現類。
注入機制
所謂注入機制,是指如何將工廠創建的對象實例注入到應用或其他對象。
就Spring
Web應用而言,注入方法是通過web.xml來實現的。Spring會監聽Web應用上下文的加載事件,并利用鉤子捕獲類加載器的行為,從而分離出任何
需被創建的對象。此后,若有需要,工廠將實例化對象,并填充它所需的依賴。當然在向應用返回對象之前,這些依賴本身也可能需要實例化。這個過程即所謂的
“(將依賴與對象)捆綁在一起”。
在Flex中,類的加載原理有所不同,因此捆綁方法也就不同。目前有兩種方法:
- 客戶對象直接從工廠請求(已捆綁好的)對象
- 利用內置的Flex事件機制(用于實例化視圖)觸發注入
看了一些文章之后發現還是不能夠很好的了解Flex IOC框架比如spring Actionscript與Spring BlazeDS Integeration 到底有何不同。
到spring官方網站一看究竟,目前Spring官方網站上有兩個項目:
Spring BlazeDS Integration
Spring Ationscript
這兩個項目讓你在客戶端的Actionscript編碼中以及服務端的Java編碼中,都能夠使用Spring的各種優秀特性。
兩者的不容之處在于
Spring BlazeDS Integeration 允許你在服務端使用Spring容器來組織你的代碼,維護的你代碼依賴。并且,把你的服務通過相應的配置暴露給客戶端。
Spring Actionscript則是一個基于Actionscript代碼的Ioc容器(目前還不支持AOP).可以讓你在客戶端使用Ioc管理依賴注入.
下面分別看下,首先來探討下Spring Actionscript以及其它的IoC框架。
Spring ActionScript
Spring ActionScript前身為Prana,因其成熟度高,成為了一個知名框架。
核心概念
任何使用過Spring的Java或.NET版本的人,都會很快熟悉Spring ActionScript。你在運行時加載的配置文件,可以給工廠提供足夠信息,用于實例化被應用請求的任何對象。
基本配置
在標準例子工程中使用Spring ActionScript,需如下三個基本步驟:
- 創建文件application-context.xml
- 初始化應用中的工廠對象
- 在你的視圖層(或其他任何地方),根據需要從工廠獲得對象以供使用
對象工廠和對象配置
在Spring ActionScript中,對象聲明在應用可訪問的XML文件(通常命名為application-context.xml)中。此配置文件由XMLApplicationContext(是ObjectFactory的子類)加載。
Spring ActionScript是一個優秀的、成熟的、開發活動十分活躍的IOC框架,任何用過Spring框架的人都熟悉的。
以XML形式聲明對象存在一個問題,即在XML中聲明一個類,并且這個類沒被包含在SWF中(因為在你的應用中沒有對它的直接引用)時,Flash
Player會在運行時拋出異常。其解決辦法是創建一個ActionScript類,聲明它對上下文XML的依賴,并將此類包含在應用中。
Parsley
Parsley也是一個成熟的IOC框架,最初靈感來源于Spring。它近期經歷過一次較大規模的重寫。新版本支持一些本地Flex特性,如綁定和元數據,使你在配置你的工程時有更多更好的選擇。
核心概念
Parsley的核心概念是源自于Spring的上下文,也即應用的依賴注入的配置。
Parsley的配置現在支持多種形式,其中包括XML和MXML。你可以使用本地的MXML標記或Parsley庫提供的自定義MXML標簽。Parsley使用元數據標簽實現對注入機制的支持,這和Swiz框架是類似的。
Parsley還支持消息模式。基本不需代碼干預,你就能將你的對象配置為事件源或事件處理器。在這個例子中,我會用這個特性替代Controller模式。
基本配置
Parsley的配置分三個基本步驟:
- 創建Config.mxml文件。
- 在應用的根部初始化一個Context對象。
- 在你的視圖中,用Inject元數據實現依賴的注入。
準備配置文件的方法有多種,不過在這個例子中,我使用支持本地標記和Parsley標簽的MXML文件。這種方法的好處是在編譯時就將類引入,當然這樣一來,也就不能直接修改已被編譯的應用的配置了。
對象工廠和對象配置
在Config.mxml中,你能看到應用中用到的從域模型到代理的所有對象。聲明這些對象的方式有兩種:
- 標準的MXML
- 使用Parsley的對象定義標簽
在后面的內容中,我將詳細介紹這種方法。
總結
經過其他一些框架的不斷啟發,新版本的Parsley已發展成為一個完整的IOC框架。它還支持模塊式開發和上下文卸載。在模塊化Flex應用開發日益盛行的今天,這無疑是一個十分重要的特性
Spring BlazeDS Integration
其目標是:開發者可以利用Spring開發模型通過Adobe
Flex、BlazeDS、Spring以及Java技術創建RIA。這樣我們就可以通過BlazeDS公開Spring管理的服務而無需額外的配置文
件。其優勢在于將Spring的易用性與Flex、BlazeDS以及Java整合起來以共同創建應用。
Spring的核心配置是通過Java bean實現的。借助于bean,任何Java類都能被公開成為服務。
為了將這些bean公開成為Flex客戶端所用的遠程服務,Integration項目采用了Spring Web MVC。Spring Web
MVC將DispatcherServlet作為一個中央分發器,用以處理任何類型的HTTP請求或是基于HTTP的遠程服務。我們可以通過相同的
JavaBean配置方式來配置該DispatcherServlet以將請求轉發給相應的處理器進行后續處理。