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