JBoss Seam--Java最優(yōu)秀的快速開發(fā)框架之一
JBoss Seam,算得上是Java開源框架里面最優(yōu)秀的快速開發(fā)框架之一。
一、Seam適應(yīng)快速開發(fā)、簡(jiǎn)化框架的趨勢(shì)
在RoR 流行之前,Java社區(qū)的主流還是非常講究分層、架構(gòu)、復(fù)用和模式,而比較忽視快速開發(fā)和簡(jiǎn)化架構(gòu)的,其結(jié)果就是代碼量大、開發(fā)周期長(zhǎng)、架構(gòu)相當(dāng)煩瑣。以比較常見的Struts/Spring/Hibernate為例,從大的分層來說就有Web層、業(yè)務(wù)層和持久層,從細(xì)的分層就從前到后有:View(JSP) -> Struts Action -> Spring Business Object Bean -> Spring DAO Bean -> Hibernate Persistent Object。如果有Remoting調(diào)用,那么還需要相應(yīng)的Service Facade層。每層都是用不同的技術(shù)框架或者模式、各層之間整合的方式也是五花八門。把整個(gè)項(xiàng)目的架構(gòu)搭建起來,已經(jīng)是非常麻煩的事情了。
Seam 給我的感覺像是一個(gè)異常簡(jiǎn)單的MVC框架,他實(shí)際上只有兩層:JSF View和 Seam Component。而Seam Component有兩類:一類是Entity Bean,另一類就是Session Bean。Entity Bean映射數(shù)據(jù)庫(kù)表,Session Bean完成所有的業(yè)務(wù)邏輯,包括可能的持久化,事務(wù),響應(yīng)頁面請(qǐng)求、商業(yè)邏輯,頁面流控制等等。配置文件也不多,除了一堆基礎(chǔ)的配置文件,唯一一個(gè)需要不斷修改的就是pages.xml了,即配置JSF的view映射。
所以Seam開發(fā)項(xiàng)目看起來很簡(jiǎn)單、很直接,無分層之苦惱。相應(yīng)的也會(huì)讓程序員把精力主要放在業(yè)務(wù)邏輯組件的實(shí)現(xiàn)上,而不是把精力浪費(fèi)在架構(gòu)、分層、模式和基礎(chǔ)設(shè)施搭建的工作上面。
二、Seam的數(shù)據(jù)綁定做的很出色
由于是一個(gè)簡(jiǎn)單的兩層結(jié)構(gòu),View和Component之 間的數(shù)據(jù)綁定做的很出色,看起來比我欣賞的Webwork的數(shù)據(jù)綁定方式更勝一籌。官 方的說法叫做雙向依賴注入,在component里面可以直接取到頁面提交的數(shù)據(jù),在頁面也可以直接訪問component數(shù)據(jù)。
另外持久化數(shù)據(jù)的校驗(yàn)也直接集成好了,在EntityBean里面聲明數(shù)據(jù)的約束,在頁面就可以直接校驗(yàn)了,和RoR的數(shù)據(jù)校驗(yàn)方式是一樣的,當(dāng)然這也得益于Gavin King是Seam和Hibernate兩個(gè)項(xiàng)目的作者的緣故。
三、Seam的組件機(jī)制看起來相當(dāng)好用
既然Seam簡(jiǎn)化了分層,實(shí)際上把主要的工作都推到組件層去完成了。但是Seam的組件層看起來很簡(jiǎn)單,這得益于Seam的組件機(jī)制設(shè)計(jì)了很多的組件狀態(tài),根據(jù)不同的組件狀態(tài),天然的劃分了不同組件的功能和邏輯。
Seam 的組件有點(diǎn)類似于把傳統(tǒng)MVC的Action和Spring的Bean合二為一了,但還是不同于傳統(tǒng)的MVC框架下面的Action:傳 統(tǒng)的MVC Action是基于頁面請(qǐng)求的,無法復(fù)用,而Seam的組件是事件驅(qū)動(dòng)方式,它只需要捕獲和實(shí)現(xiàn)事件代碼就可以了,至于怎么觸發(fā)它并不需要知道,他和 Web層可以不綁定,因此理論上面來說是可以實(shí)現(xiàn)組件復(fù)用的。我個(gè)人認(rèn)為Seam的這個(gè)組件機(jī)制非常巧妙,既可以用來實(shí)現(xiàn)響應(yīng)頁面事件,綁定頁面數(shù)據(jù)的所謂Web Bean,也可以用來實(shí)現(xiàn)和Web沒有任何關(guān)系的純業(yè)務(wù)邏輯組件,一個(gè)很漂亮的實(shí)現(xiàn)。
另外Seam的組件注入機(jī)制看起來也很簡(jiǎn)單,不像Spring那樣麻煩,而且內(nèi)置了很多現(xiàn)成的組件進(jìn)來,直接用Annotation聲明一下就可以用了,感覺寫組件真的很方便、很靈活、很強(qiáng)大。
四、Seam把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝完全隱藏起來了
Spring 的數(shù)據(jù)庫(kù)資源管理和事務(wù)封裝是通過提供了一系列的代理類以及配置文件來實(shí)現(xiàn)的,程序員還是要通過配置文件的方式來手工管理事務(wù),訪問數(shù)據(jù)庫(kù)也必須通過Template編寫匿名內(nèi)部類來實(shí)現(xiàn),而且在Spring/Hibernate框架下面,OpenSessionInView是一個(gè)很討厭的問題。
但是Seam已經(jīng)把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝全部都隱藏起來了,程序員完全不需要知道,也不需要操心這些事情,這真是個(gè)大大的解放。當(dāng)然 Seam可以做到這一點(diǎn),也無非是因?yàn)镾eam提供了一套上至View層,下至持久層完整的框架,因此可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在框架內(nèi)部,不暴露給程序員。 Spring之所以做不到這一點(diǎn),也因?yàn)樗怀洚?dāng)了一個(gè)黏合劑,不能夠直接修改View層和持久層帶來的限制。
五、Seam對(duì)第三方框架的整合看起來比Spring更深入
原來印象當(dāng)中只有Spring才提供了一站式的解決方案,這次一看Seam文檔,呵!發(fā)現(xiàn)Seam也都齊全了,什么郵件啦、工作流啦、頁面流啦、規(guī)則引擎啦、異步任務(wù)調(diào)度啦、消息系統(tǒng)啦、Web服務(wù)啦、遠(yuǎn)程調(diào)用啦、甚至全文檢索啦全部都集成了。而且集成的比Spring更深入一些,例如Java EE本身的JMS,MDB自然是Seam的強(qiáng)項(xiàng),而JBoss自家的JBPM,JPDL,Rules集成的更加沒得說。
從整合角度來說,感覺Spring和Seam的出發(fā)點(diǎn)不同:Spring更像一個(gè)平臺(tái),我提供整合的可能性,然后程序員你自家去整合,我提供一些寫好的整合bean,對(duì)于這些你通過XML配置一下就整合進(jìn)來了,如果我沒有提供bean的,那么你也可以自己寫bean來整合。而Seam更像一個(gè)完整的框架而不是平臺(tái),我這個(gè)框架想提供的功能,框架自身就已經(jīng)整合好了,你直接用就是了,你也可以自己寫擴(kuò)展來整合,但是這個(gè)不是Seam希望程序員做的事情。
因此對(duì)于程序員的感覺來說,Spring給你提供了一切的零件和半成品,但你要自己動(dòng)手來組裝,而Seam已經(jīng)給你裝好了一個(gè)成品,你就別自己改裝了,直接拿去用吧。
六、Seam提供了方便的代碼生成器
和appfuse 類似,可以直接用ant task來生成一個(gè)完整項(xiàng)目的骨架,以及相應(yīng)的組件代碼生成器,利用seam-gen可以快速生成一個(gè)完整的、帶有AJAX功能的CRUD項(xiàng)目,而且還是一個(gè)eclipse或者netbeans工程,你可以直接用IDE打開編輯了。這功能雖然不太難做,但是對(duì)于程序員來說,幫助是很大的。Seam做的相當(dāng)不錯(cuò)。
以上是我對(duì)Seam的一點(diǎn)小小的贊許,當(dāng)然我也有一點(diǎn)疑問:
一、Seam的View實(shí)現(xiàn)是JSF,看頁面代碼還是密密麻麻的Tag
我是非常反感JSP Tag的,看看頁面密密麻麻的Tag就頭皮發(fā)麻,能不能弄一個(gè)Template呀,例如freemarker啥的?這些Tag既不直觀,也不方便擴(kuò)展。需要擴(kuò)展頁面組件,總不能讓我自定義Tag去干活吧?不清楚這個(gè)問題怎么辦?像freeamarker還可以方便的自定義頁面宏呢。
二、每次修改都要重新打包發(fā)布,太麻煩了吧
就算修改一個(gè)頁面,也要整個(gè)打包deploy成為一個(gè)ear去拷貝到j(luò)boss的應(yīng)用目錄下面,這個(gè)要是改頁面,不是得煩死? 我以前都是在項(xiàng)目里面直接內(nèi)嵌Jetty,作為一個(gè)application啟動(dòng),修改頁面根本無需重起呀,更不要說deploy了。
總體來說,我覺得Seam框架非常出色,尤其是他的組件機(jī)制設(shè)計(jì)的很有匠心,真不愧是Gavin King精心打造的框架了,雖然看起來還是有些缺陷,但是做企業(yè)應(yīng)用項(xiàng)目的話,Seam是一個(gè)很棒的選擇,作為程序員來說,要比用 Spring/Hibernate/Struts省心的多,更能夠把精力放在業(yè)務(wù)邏輯的編寫上面,開發(fā)效率也很不錯(cuò),可能是Java開源框架里面最優(yōu)秀的快速開發(fā)框架之一了
一、Seam適應(yīng)快速開發(fā)、簡(jiǎn)化框架的趨勢(shì)
在RoR 流行之前,Java社區(qū)的主流還是非常講究分層、架構(gòu)、復(fù)用和模式,而比較忽視快速開發(fā)和簡(jiǎn)化架構(gòu)的,其結(jié)果就是代碼量大、開發(fā)周期長(zhǎng)、架構(gòu)相當(dāng)煩瑣。以比較常見的Struts/Spring/Hibernate為例,從大的分層來說就有Web層、業(yè)務(wù)層和持久層,從細(xì)的分層就從前到后有:View(JSP) -> Struts Action -> Spring Business Object Bean -> Spring DAO Bean -> Hibernate Persistent Object。如果有Remoting調(diào)用,那么還需要相應(yīng)的Service Facade層。每層都是用不同的技術(shù)框架或者模式、各層之間整合的方式也是五花八門。把整個(gè)項(xiàng)目的架構(gòu)搭建起來,已經(jīng)是非常麻煩的事情了。
Seam 給我的感覺像是一個(gè)異常簡(jiǎn)單的MVC框架,他實(shí)際上只有兩層:JSF View和 Seam Component。而Seam Component有兩類:一類是Entity Bean,另一類就是Session Bean。Entity Bean映射數(shù)據(jù)庫(kù)表,Session Bean完成所有的業(yè)務(wù)邏輯,包括可能的持久化,事務(wù),響應(yīng)頁面請(qǐng)求、商業(yè)邏輯,頁面流控制等等。配置文件也不多,除了一堆基礎(chǔ)的配置文件,唯一一個(gè)需要不斷修改的就是pages.xml了,即配置JSF的view映射。
所以Seam開發(fā)項(xiàng)目看起來很簡(jiǎn)單、很直接,無分層之苦惱。相應(yīng)的也會(huì)讓程序員把精力主要放在業(yè)務(wù)邏輯組件的實(shí)現(xiàn)上,而不是把精力浪費(fèi)在架構(gòu)、分層、模式和基礎(chǔ)設(shè)施搭建的工作上面。
二、Seam的數(shù)據(jù)綁定做的很出色
由于是一個(gè)簡(jiǎn)單的兩層結(jié)構(gòu),View和Component之 間的數(shù)據(jù)綁定做的很出色,看起來比我欣賞的Webwork的數(shù)據(jù)綁定方式更勝一籌。官 方的說法叫做雙向依賴注入,在component里面可以直接取到頁面提交的數(shù)據(jù),在頁面也可以直接訪問component數(shù)據(jù)。
另外持久化數(shù)據(jù)的校驗(yàn)也直接集成好了,在EntityBean里面聲明數(shù)據(jù)的約束,在頁面就可以直接校驗(yàn)了,和RoR的數(shù)據(jù)校驗(yàn)方式是一樣的,當(dāng)然這也得益于Gavin King是Seam和Hibernate兩個(gè)項(xiàng)目的作者的緣故。
三、Seam的組件機(jī)制看起來相當(dāng)好用
既然Seam簡(jiǎn)化了分層,實(shí)際上把主要的工作都推到組件層去完成了。但是Seam的組件層看起來很簡(jiǎn)單,這得益于Seam的組件機(jī)制設(shè)計(jì)了很多的組件狀態(tài),根據(jù)不同的組件狀態(tài),天然的劃分了不同組件的功能和邏輯。
Seam 的組件有點(diǎn)類似于把傳統(tǒng)MVC的Action和Spring的Bean合二為一了,但還是不同于傳統(tǒng)的MVC框架下面的Action:傳 統(tǒng)的MVC Action是基于頁面請(qǐng)求的,無法復(fù)用,而Seam的組件是事件驅(qū)動(dòng)方式,它只需要捕獲和實(shí)現(xiàn)事件代碼就可以了,至于怎么觸發(fā)它并不需要知道,他和 Web層可以不綁定,因此理論上面來說是可以實(shí)現(xiàn)組件復(fù)用的。我個(gè)人認(rèn)為Seam的這個(gè)組件機(jī)制非常巧妙,既可以用來實(shí)現(xiàn)響應(yīng)頁面事件,綁定頁面數(shù)據(jù)的所謂Web Bean,也可以用來實(shí)現(xiàn)和Web沒有任何關(guān)系的純業(yè)務(wù)邏輯組件,一個(gè)很漂亮的實(shí)現(xiàn)。
另外Seam的組件注入機(jī)制看起來也很簡(jiǎn)單,不像Spring那樣麻煩,而且內(nèi)置了很多現(xiàn)成的組件進(jìn)來,直接用Annotation聲明一下就可以用了,感覺寫組件真的很方便、很靈活、很強(qiáng)大。
四、Seam把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝完全隱藏起來了
Spring 的數(shù)據(jù)庫(kù)資源管理和事務(wù)封裝是通過提供了一系列的代理類以及配置文件來實(shí)現(xiàn)的,程序員還是要通過配置文件的方式來手工管理事務(wù),訪問數(shù)據(jù)庫(kù)也必須通過Template編寫匿名內(nèi)部類來實(shí)現(xiàn),而且在Spring/Hibernate框架下面,OpenSessionInView是一個(gè)很討厭的問題。
但是Seam已經(jīng)把數(shù)據(jù)庫(kù)資源的管理和事務(wù)的封裝全部都隱藏起來了,程序員完全不需要知道,也不需要操心這些事情,這真是個(gè)大大的解放。當(dāng)然 Seam可以做到這一點(diǎn),也無非是因?yàn)镾eam提供了一套上至View層,下至持久層完整的框架,因此可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在框架內(nèi)部,不暴露給程序員。 Spring之所以做不到這一點(diǎn),也因?yàn)樗怀洚?dāng)了一個(gè)黏合劑,不能夠直接修改View層和持久層帶來的限制。
五、Seam對(duì)第三方框架的整合看起來比Spring更深入
原來印象當(dāng)中只有Spring才提供了一站式的解決方案,這次一看Seam文檔,呵!發(fā)現(xiàn)Seam也都齊全了,什么郵件啦、工作流啦、頁面流啦、規(guī)則引擎啦、異步任務(wù)調(diào)度啦、消息系統(tǒng)啦、Web服務(wù)啦、遠(yuǎn)程調(diào)用啦、甚至全文檢索啦全部都集成了。而且集成的比Spring更深入一些,例如Java EE本身的JMS,MDB自然是Seam的強(qiáng)項(xiàng),而JBoss自家的JBPM,JPDL,Rules集成的更加沒得說。
從整合角度來說,感覺Spring和Seam的出發(fā)點(diǎn)不同:Spring更像一個(gè)平臺(tái),我提供整合的可能性,然后程序員你自家去整合,我提供一些寫好的整合bean,對(duì)于這些你通過XML配置一下就整合進(jìn)來了,如果我沒有提供bean的,那么你也可以自己寫bean來整合。而Seam更像一個(gè)完整的框架而不是平臺(tái),我這個(gè)框架想提供的功能,框架自身就已經(jīng)整合好了,你直接用就是了,你也可以自己寫擴(kuò)展來整合,但是這個(gè)不是Seam希望程序員做的事情。
因此對(duì)于程序員的感覺來說,Spring給你提供了一切的零件和半成品,但你要自己動(dòng)手來組裝,而Seam已經(jīng)給你裝好了一個(gè)成品,你就別自己改裝了,直接拿去用吧。
六、Seam提供了方便的代碼生成器
和appfuse 類似,可以直接用ant task來生成一個(gè)完整項(xiàng)目的骨架,以及相應(yīng)的組件代碼生成器,利用seam-gen可以快速生成一個(gè)完整的、帶有AJAX功能的CRUD項(xiàng)目,而且還是一個(gè)eclipse或者netbeans工程,你可以直接用IDE打開編輯了。這功能雖然不太難做,但是對(duì)于程序員來說,幫助是很大的。Seam做的相當(dāng)不錯(cuò)。
以上是我對(duì)Seam的一點(diǎn)小小的贊許,當(dāng)然我也有一點(diǎn)疑問:
一、Seam的View實(shí)現(xiàn)是JSF,看頁面代碼還是密密麻麻的Tag
我是非常反感JSP Tag的,看看頁面密密麻麻的Tag就頭皮發(fā)麻,能不能弄一個(gè)Template呀,例如freemarker啥的?這些Tag既不直觀,也不方便擴(kuò)展。需要擴(kuò)展頁面組件,總不能讓我自定義Tag去干活吧?不清楚這個(gè)問題怎么辦?像freeamarker還可以方便的自定義頁面宏呢。
二、每次修改都要重新打包發(fā)布,太麻煩了吧
就算修改一個(gè)頁面,也要整個(gè)打包deploy成為一個(gè)ear去拷貝到j(luò)boss的應(yīng)用目錄下面,這個(gè)要是改頁面,不是得煩死? 我以前都是在項(xiàng)目里面直接內(nèi)嵌Jetty,作為一個(gè)application啟動(dòng),修改頁面根本無需重起呀,更不要說deploy了。
總體來說,我覺得Seam框架非常出色,尤其是他的組件機(jī)制設(shè)計(jì)的很有匠心,真不愧是Gavin King精心打造的框架了,雖然看起來還是有些缺陷,但是做企業(yè)應(yīng)用項(xiàng)目的話,Seam是一個(gè)很棒的選擇,作為程序員來說,要比用 Spring/Hibernate/Struts省心的多,更能夠把精力放在業(yè)務(wù)邏輯的編寫上面,開發(fā)效率也很不錯(cuò),可能是Java開源框架里面最優(yōu)秀的快速開發(fā)框架之一了
posted on 2008-10-07 16:38 百科 閱讀(549) 評(píng)論(0) 編輯 收藏