1、Jdon為什么會(huì)讓我們抓狂?
平安夜的狂歡過(guò)后,Jdon已經(jīng)三歲了,已經(jīng)到了5.1版本,作為中國(guó)的第一個(gè)java開(kāi)源框架,相比很多胎死腹中的畸形胎兒(比如G-Roller等),可以算是非常健康長(zhǎng)壽了,值得所有熱愛(ài)并從事著開(kāi)源的人們學(xué)習(xí)、反思。
不知道為了什么?直到現(xiàn)在仍然還有人對(duì)他以及他的創(chuàng)始人抱有深深的偏見(jiàn)或者嫉恨。一個(gè)能讓這么多人抓狂的框架,如果你對(duì)他不了解,那真是一個(gè)遺憾。畢竟不是任何東西都能讓人抓狂的,而且是讓很多“牛”人們集體抓狂,更是不容易。是因?yàn)樗_實(shí)太濫或者又他太優(yōu)秀?是因?yàn)樗址噶舜蠹业睦孢€是他在給我們宣揚(yáng)錯(cuò)誤的思想及理念?或者都是,又或者又都不是,也許只有身在其中的人們才知道。
通過(guò)兩天對(duì)Jdon框架的應(yīng)用體驗(yàn)及源碼分析,今天從第三方的角度來(lái)審視Jdon,根據(jù)我所了解的Jdon的框架,談?wù)勎业恼J(rèn)識(shí)及感受,希望能讓你對(duì)Jdon有一個(gè)全新的認(rèn)識(shí),又或者能為Jdon的發(fā)展做出一些小小的貢獻(xiàn)。
2、Jdon是什么
Jdon是什么?回答這個(gè)問(wèn)題可以直接借助他的創(chuàng)始人板橋?qū)懺谄涔俜骄W(wǎng)站上的介紹:Jdon Framework(簡(jiǎn)稱(chēng)JF)是一套適合開(kāi)發(fā)中小型J2EE/JavaEE應(yīng)用系統(tǒng)的輕量Web框架(Lightweight Java Web Framework)。JF誕生于2004年底,是國(guó)人獨(dú)立開(kāi)發(fā)的中國(guó)人自己的框架產(chǎn)品,2005年入選全球SUN公司網(wǎng)站java.net正式企業(yè)應(yīng)用目錄。經(jīng)過(guò)多年發(fā)展和眾多用戶(hù)的使用及其完善,JF已經(jīng)發(fā)展成為一套成熟的、面向?qū)ο蟮摹⒒跇?gòu)件(基于組件)的輕量快速開(kāi)發(fā)框架。Jdon是嚴(yán)格堅(jiān)持分層架構(gòu)(表現(xiàn)層、業(yè)務(wù)層和持久層)下的快速開(kāi)發(fā)。JF是快速性和靈活性綜合平衡的產(chǎn)物,它帶來(lái)了多快好省的簡(jiǎn)單的解決之道(simplify the best):對(duì)于小項(xiàng)目,使用Jdon框架可以開(kāi)發(fā)出高質(zhì)量可擴(kuò)展的好的系統(tǒng);對(duì)于大項(xiàng)目,使用Jdon框架可以更快地開(kāi)發(fā)出系統(tǒng)。
也許現(xiàn)在看來(lái)這些特性都沒(méi)什么,但如果在當(dāng)時(shí),確是非常具有革命性的,用板橋的話:“顛覆對(duì)象使用之前必須創(chuàng)建的基本定律,正象無(wú)需關(guān)心對(duì)象銷(xiāo)毀一樣,您可以無(wú)需關(guān)心對(duì)象創(chuàng)建。”,“面向?qū)ο缶幊讨窯rady Booch 說(shuō):對(duì)象最偉大處在于其可被替代。而Jdon框架偉大之處是幫助你替代這些對(duì)象,甚至包括Jdon框本身。”
板橋一下強(qiáng)調(diào):“Jdon框架不是面向數(shù)據(jù)庫(kù)的;而是面向模型分析設(shè)計(jì)(OOA/OOD)。”
當(dāng)然,孩子永遠(yuǎn)是自家的好,我們不能只聽(tīng)板橋說(shuō)他如何我們就認(rèn)為他怎樣?究竟這個(gè)框架是好還是差,耳聽(tīng)為虛,眼見(jiàn)為實(shí)。既然都是開(kāi)源項(xiàng)目,我們只需要下載他的源代碼看看,并跟同類(lèi)的開(kāi)源比較一下就知道。如果你跟我一樣,通過(guò)看他的文檔,閱讀他的代碼,你才會(huì)真正了解Jdon究竟是什么。
一個(gè)IOC框架
Jdon是一個(gè)IOC容器(板橋也算是最早把IOC的概念引入國(guó)內(nèi)的少數(shù)牛人之一,并且能通過(guò)集成到j(luò)don中向大家展示IoC的使用),這個(gè)IOC容器能實(shí)現(xiàn)自動(dòng)按構(gòu)造子注入組件所依賴(lài)的對(duì)象。這個(gè)Ioc需要配置的東西不多,比如:你只需要在一個(gè)類(lèi)似jdonframework.xml的xml文件中寫(xiě)類(lèi)似下面的配置信息:
<services>
<pojoService name="testService" class="com.jdon.framework.test.service.TestServicePOJOImp"/>
</services>
你就能在你的Action中使用下面的代碼訪問(wèn)這個(gè)testService
TestService testService = (TestService) WebAppUtil.getService("testService ", request);
testService.createUser(em);
當(dāng)然,你必須要搞清楚的是,Jdon的Ioc實(shí)現(xiàn)并不是從頭開(kāi)始實(shí)現(xiàn)了一個(gè)IoC,他是通過(guò)在picocontainer基礎(chǔ)上進(jìn)行封裝實(shí)現(xiàn)的。
簡(jiǎn)單的AOP及攔截器實(shí)現(xiàn)
基于面向切面的編程,可以把面向?qū)ο蟮姆椒ú荒芎芎媒鉀Q的問(wèn)題很輕松的解決掉。Jdon在aopalliance定義的API基礎(chǔ)上,實(shí)現(xiàn)了一個(gè)非常簡(jiǎn)單的AOP,其實(shí)就是幾個(gè)類(lèi),使用代理實(shí)現(xiàn)了對(duì)方法的環(huán)繞攔截。雖然沒(méi)有AspejctJ及Spring的AOP強(qiáng)大,但對(duì)于應(yīng)用80%的AOP需求,已經(jīng)足夠。
Jdon立足中大型應(yīng)用需求,充分發(fā)揮Java在企業(yè)應(yīng)用開(kāi)發(fā)中的優(yōu)勢(shì),考慮到性能等很多因素,Jdon框架還通過(guò)成功應(yīng)用攔截器,實(shí)現(xiàn)了對(duì)象Cache、對(duì)象池等功能。你可以在一個(gè)像aspect.xml這樣的文件中配置你的攔截器,實(shí)現(xiàn)對(duì)一組一組的對(duì)象進(jìn)行攔截:
<interceptor name="cacheInterceptor"
class="com.jdon.aop.interceptor.CacheInterceptor"
pointcut="services" />
JdonAOP攔截器目標(biāo)對(duì)象組有三種:全部目標(biāo)服務(wù);EJB服務(wù);POJO服務(wù)(EJB服務(wù)和POJO服務(wù)是在JdonFramework.xml中定義的ejbService和pojoService)
針對(duì)訪問(wèn)EJB業(yè)務(wù)組件的封裝
Jdon充分考慮到在大型的分布式應(yīng)用中,一些功能仍然必須依靠EJB這種重量級(jí)的業(yè)務(wù)組件來(lái)完成的現(xiàn)狀。相對(duì)于其它一些同類(lèi)框架,從框架底層到最終應(yīng)用都考慮到對(duì)EJB支持及簡(jiǎn)化。比如針對(duì)EJB2的一個(gè)業(yè)務(wù)組件,可以直接配置成下面的形式:
<ejbService name="testService" >
<jndi name="TestEJB" />
<ejbHomeObject class="com.jdon.framework.test.ejb.TestEJBHome"/>
<ejbRemoteObject class="com.jdon.framework.test.ejb.TestEJBRemote"/>
<interface class="com.jdon.framework.test.service.TestService" />
</ejbService>
而在Action中使用的時(shí)候,還是像使用普通的pojoService一樣,WebAppUtil.getService方法即可獲得。
持久層數(shù)據(jù)訪問(wèn)封裝
企業(yè)級(jí)應(yīng)用80%都會(huì)涉及到數(shù)據(jù)庫(kù)的持久化。因此,Jdon提供了對(duì)持久層數(shù)據(jù)訪問(wèn)的簡(jiǎn)單封裝,提供了一個(gè)JdbcTemp類(lèi)來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作,另外還提供了數(shù)據(jù)訪問(wèn)層的DaoCRUD接口,以及一個(gè)Hibernate的實(shí)現(xiàn),訪問(wèn)我們使用Hibernate來(lái)進(jìn)行對(duì)象持久化。
如下面的代碼使用Jdon中提供的jdbc模板類(lèi)來(lái)操作數(shù)據(jù)庫(kù):
//適合查詢(xún)返回結(jié)果是單個(gè)字段,如:
// select name from user where id=?
public Object querySingleObject(Collection queryParams, String sqlquery) throws Exception {
return jdbcTemp.querySingleObject(queryParams, sqlquery);
}
Struts1.x工具集合
Jdon在我看來(lái)有一點(diǎn)感覺(jué)是為使用Struts1.x開(kāi)的人用的,因?yàn)樗Q生的時(shí)候,struts1.x正處于鼎盛時(shí)期。因此,框架內(nèi)部集成了很多開(kāi)發(fā)struts1.x應(yīng)用的實(shí)用工具,全部放在strutsutil及下面的包中,包含基于Struts1.x的通用業(yè)務(wù)處理如ModelDispAction、ModelListActionAction等,文件上傳封裝,基于Struts1.x的樹(shù)形組件以及自定義的分頁(yè)標(biāo)簽等。如下圖所示:
一個(gè)圍繞Struts1.x+POJO(EJB) Service+Hibernate的快速開(kāi)發(fā)框架
說(shuō)到快速開(kāi)發(fā)框架,我想大家都不陌生,JavaEE領(lǐng)由于涉及到的技術(shù)及選擇性太多,導(dǎo)致現(xiàn)在的快速開(kāi)發(fā)框架可以說(shuō)是五化八門(mén),國(guó)際上比較知名的有appfuse,國(guó)內(nèi)比較有名的有springside及easyjf等。而jdon在做那么多基礎(chǔ)性功能的情況下,也實(shí)現(xiàn)了一個(gè)快速開(kāi)發(fā)框架。也許他的核心及目標(biāo)也就是這個(gè)快速開(kāi)發(fā)框架,他是最終能讓這個(gè)框架立竿見(jiàn)影的重要部分。
使用Jdon的快速開(kāi)發(fā)框架,可以使用對(duì)象驅(qū)動(dòng)的方式開(kāi)發(fā)j2ee應(yīng)用。Jdon框架中花了大量的精力及資源來(lái)解決模型CRUD的問(wèn)題,整個(gè)框架中差不多一半的代碼都是為實(shí)現(xiàn)這個(gè)靈活、快速、基于對(duì)象驅(qū)動(dòng)的快速框架而寫(xiě)的。為了一個(gè)添刪改查,你只需要一個(gè)模型、一個(gè)業(yè)務(wù)組件、一個(gè)Form、兩個(gè)配置文件,就能實(shí)現(xiàn)一個(gè)非常簡(jiǎn)單的添刪改查找應(yīng)用。比如針對(duì)留言Message進(jìn)行添刪改查,需要下面的內(nèi)容:
域模型
public class Message extends Model {
private String messageId;
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
業(yè)務(wù)邏輯層
public interface MessageService {
public void createMessage(EventModel em);
public void updateMessage(EventModel em);
public void deleteMessage(EventModel em);
public Message getMessage(String messageId);
}
實(shí)現(xiàn)及DAO層的代碼這里省略。
一個(gè)Form(Struts1.x的產(chǎn)物):
public class MessageForm extends ModelForm {
private String messageId;
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
業(yè)務(wù)層配置文件jdonframework.xml
<models>
<!-- 配置模型的類(lèi)是Message,其主鍵是messageId -->
<model key="messageId" class ="sample.model.Message">
<!-- 下行是配置界面模型MessageForm -->
<actionForm name="messageForm"/>
<handler>
<!-- 以下配置MessageService -->
<service ref="messageService">
<getMethod name="getMessage" />
<createMethod name="createMessage" />
<updateMethod name="updateMessage" />
<deleteMethod name="deleteMessage" />
</service>
</handler>
</model>
</models>
<services>
<!-- 以下配置MessageService -->
<pojoService name="messageService" class="sample.service.MessageServiceImp"/>
</services>
Struts-config.xml配置文件
<struts-config>
<form-beans>
<form-bean name="messageForm" type="sample.web.MessageForm" />
……
</form-beans>
…..
<plug-in className="com.jdon.strutsutil.InitPlugIn">
<set-property property="modelmapping-config" value="jdonframework.xml" />
</plug-in>
<action name="messageForm" path="/messageAction" type="com.jdon.strutsutil.ModelViewAction"
scope="request" validate="false">
<forward name="create" path="/message.jsp" />
<forward name="edit" path="/message.jsp" />
</action>
<action name="messageForm" path="/messageSaveAction" type="com.jdon.strutsutil.ModelSaveAction"
scope="request" validate="true" input="/message.jsp">
<forward name="success" path="/result.jsp" />
<forward name="failure" path="/result.jsp" />
</action>
</struts-config>
3、Jdon給了我們什么
看了上面的功能介紹,也許確實(shí)沒(méi)給你帶來(lái)更多的驚喜。但是想想如果你是三年前的今天看到這么多的介紹會(huì)是怎樣?也許那時(shí)候你才開(kāi)始學(xué)hibernate,或者剛使用struts沒(méi)多久,又或者還在為什么是model2的web應(yīng)用而困惑,更別說(shuō)什么是IoC或AOP了。如果那時(shí)你知道國(guó)人有這么一個(gè)框架,使用了這么多先進(jìn)的理念、引入了很多先進(jìn)的技術(shù)、并且可以讓我們開(kāi)發(fā)Struts應(yīng)用基本上不用寫(xiě)太多的java代碼,你會(huì)是什么樣的感受?
其實(shí),也許就算你現(xiàn)在不用Jdon框架來(lái)做項(xiàng)目,作為一個(gè)開(kāi)源愛(ài)好者,我仍然強(qiáng)烈推薦你去了解這個(gè)框架。因?yàn)樗?jīng)帶給我們的是很多革命性的東西。而且,就算三年后的今天,也許你已經(jīng)從一個(gè)java菜鳥(niǎo)變成了java小牛,但回頭了解Jdon框架中的很多東西,你會(huì)發(fā)現(xiàn)很多與你的代碼有著似曾相識(shí)的感覺(jué)。
Jdon框架中大量應(yīng)用了設(shè)計(jì)模式,這是面向?qū)ο缶幊倘藛T必須掌握的一門(mén)內(nèi)功。通過(guò)ServiceFactory、ServiceFacade、ContainerDirector、ComponentVisitor、HttpSessionProxyVisitor、CommonsPoolAdapter、CommonsPoolFactory、WebServiceDecorator這些名字,一個(gè)一個(gè)的去了解、挖掘,一定會(huì)非常受益。
4、Jdon的代碼質(zhì)量分析
Jdon的代碼質(zhì)量總的來(lái)說(shuō)是非常高的,不管是命名規(guī)范、代碼注釋或者是代碼結(jié)構(gòu)等。整個(gè)框架根據(jù)要實(shí)現(xiàn)的功能模塊分成aop、businessproxy、controller、container、model、strutsutil、persistence、security等大包,框架的核心部件如容器ContainerWrapper、ContainerBuilder、組件描述TargetMetaDef、動(dòng)作事件 Event、模型ModelIF等都是針對(duì)接口編程,具有一定的可擴(kuò)展性。另外整個(gè)設(shè)計(jì)中使用到大量的設(shè)計(jì)模式,可讀性也非常強(qiáng),想進(jìn)一步提高OO水平的java開(kāi)發(fā)人員值得進(jìn)一步學(xué)習(xí)研究。
代碼的注釋有的是英文,有的是中文,這種中英文混合的方式有好處有壞處。好處是國(guó)人或老外都能看懂一點(diǎn),壞處是不管對(duì)國(guó)人還是老外,都沒(méi)法讓他們徹底地搞懂。比如下面是ModelIF的代碼及注釋?zhuān)?br />
/**
* Base domain model it can be DTO or nested Model. it is the important message
* between business layer and view layer. in view layer, it is created by form
* object(such as ActionForm object);in business layer, it is created by
* business components(such as session bean).
*
* thi class can be cached, and setModified is important, this method can be
* used to refresh the cache.
*
* because setModified function ,so the class is designed for a class, but not a
* interface.
* the difference with setModified and setCacheable;
* setCacheable to false, the model will never exist in the cache.
* setModified to true, if the model exists in the cache, the client will not
* get it from cache, it is same as being deleted from cache .
* deleting the model from cache must have a condition that the deleting operator
* can access the cache of the container, if it cann't access the container,
* it cann't delete the model from cache. such it is EJB.
* @author banq
*/
public interface ModelIF extends Cacheable, Cloneable, Serializable {
/**
* in the past version, this method name is isCacheble,
* now change it after 1.3 !
*/
public boolean isCacheable();
/**
* in the past version, this method name is setCacheble,
* now change it after 1.3 !
*/
public void setCacheable(boolean cacheable);
public boolean isModified();
/**
* set the property has been modified such as : setName(String name){
* this.name = name; setModified(true); }
*
*/
public void setModified(boolean modified) ;
}
當(dāng)然,既然是中國(guó)人,那么跟所有其它的中國(guó)人一樣,一個(gè)人寫(xiě)這么多的代碼,難免也會(huì)出現(xiàn)一些小小的Bug及錯(cuò)誤,特別是一些錯(cuò)別字。比如說(shuō):ModelManager接口中的borrowtHandlerObject方法,又或者isCacheable寫(xiě)成isCacheble,或者Jdbc操作模板類(lèi)名稱(chēng)叫JdbcTemp而不叫JdbcTemplate等;另外還有把test代碼沒(méi)有跟框架代碼分離,而是跟著框架核心代碼放在一起,比如ContainerDirectorTest等;還有很多核心的接口缺少注釋?zhuān)热鏢erviceAccessor等。
如果不是為了雞蛋里面挑骨頭,但我想這些不是應(yīng)該成為這個(gè)框架不好的原因,畢竟這些問(wèn)題我想Jdon并不是無(wú)法改進(jìn)。
Jdon的代碼存放在sourceforge上面,使用cvs管理,任何人都可以從這個(gè)cvs上check out他的源代碼進(jìn)行學(xué)習(xí)及改進(jìn)。
5、Jdon還缺哪些?
前面已經(jīng)說(shuō)了很多Jdon的優(yōu)點(diǎn),但同樣是應(yīng)用程序框架,Jdon為什么沒(méi)有能像Spring那樣火呢?為什么市場(chǎng)上關(guān)于Jdon的書(shū)基本上為零呢?為什么Jdon沒(méi)有得到企業(yè)的認(rèn)可,并大量應(yīng)用呢?
因此,Jdon應(yīng)該是缺少一些東西,或者說(shuō)是關(guān)鍵的東西。為什么同樣是開(kāi)源,spring能得到那么多用戶(hù)的反饋、并不斷改進(jìn),而針對(duì)jdon的bug建議、用戶(hù)反饋卻寥寥無(wú)幾呢?是技術(shù)不行還是市場(chǎng)推廣不行?Jdon雖然發(fā)布到了5.0,但除了前面的一兩個(gè)版本,后續(xù)的版本都沒(méi)有帶來(lái)什么變革性的東西,難道是后勁不足?其實(shí)這些問(wèn)題都值得我們每一個(gè)開(kāi)源愛(ài)好者思考。本文只談?wù)勎覍?duì)技術(shù)上覺(jué)得現(xiàn)在Jdon的存在的不足,以供大家參考。
設(shè)計(jì)上的問(wèn)題
技術(shù)的進(jìn)步是永無(wú)止盡的。Jdon框架的設(shè)計(jì)仍然還存在著很多的問(wèn)題。比如,要求用戶(hù)領(lǐng)域模型繼承Jdon的Model類(lèi)或?qū)崿F(xiàn)ModelIF接口,添刪改查的業(yè)務(wù)實(shí)現(xiàn)類(lèi)中要包含類(lèi)似createXxx(EventModel em)這樣的方法,導(dǎo)致整個(gè)框架對(duì)業(yè)務(wù)層的東西侵入性太嚴(yán)重,不符合實(shí)際應(yīng)用。另外,過(guò)多與Struts1.x緊密綁定的設(shè)計(jì)也不可取。
容器的改進(jìn)
picocontainer有很多局限性,最要命的是不支持setter方法注入,這個(gè)通過(guò)實(shí)踐證明是用得最多的。picocontainer的自動(dòng)注入應(yīng)該是按類(lèi)型注入的,在實(shí)際應(yīng)用中也存在很多限制。比如下面的EmailDefine這樣的構(gòu)造子可閱讀性是非常差的,如果存在多個(gè)這樣的構(gòu)造子,稍不注意就會(huì)搞錯(cuò):
<component name="emailDefine"
class="com.jdon.jivejdon.service.imp.account.EmailDefine">
<constructor value="J道:用戶(hù)名和密碼"/>
<constructor value="您好:您索要的jdon.com網(wǎng)站登陸用戶(hù)和密碼如下:"/>
<constructor value="Jdon.com --- 解惑授道 專(zhuān)業(yè)的解決之道"/>
<constructor value="Jdon.com"/>
<constructor value="admin@jdon.com"/>
</component>
public class EmailDefine{
public EmailDefine(String s1, String s2, String s3, String s4, String s5){
}
}
因此,Jdon的IoC部份,需要增加針對(duì)setter方法注入的支持才行。
統(tǒng)一業(yè)務(wù)組件
Jdon中的業(yè)務(wù)組件包括“普通類(lèi)服務(wù)pojoService”、“普通類(lèi)component”、“EJB服務(wù)ejbService”等,不同的業(yè)務(wù)組件配置的方法還不一致,有的使用<pojoService>、有的使用<component>、有的使用<ejbService>,其實(shí)既然是松耦合,就應(yīng)該是一致的。在一個(gè)應(yīng)用中,又如何能完全區(qū)分出誰(shuí)該扮演component、誰(shuí)該叫service呢?另外攔截器還要在單獨(dú)的配置文件中進(jìn)行配置,這樣會(huì)增加了配置及處理的復(fù)雜程度。下面是當(dāng)前jdon中的一些配置片斷:
<pojoService name="testService" class="com.jdon.framework.test.service.TestServicePOJOImp"/>
<component name="jdbcDAO" class="com.jdon.framework.test.dao.JdbcDAO">
<constructor value="java:/TestDS"/>
</ component >
<context-param>
<param-name>containerConfigure</param-name>
<param-value>WEB-INF/mycontainer.xml</param-value>
</context-param>
……
<context-param>
<param-name>aspectConfigure</param-name>
<param-value>WEB-INF/myaspect.xml</param-value>
</context-param>
EJB服務(wù)
<ejbService name="testService" >
<jndi name="TestEJB" />
<ejbLocalObject class="com.jdon.framework.test.ejb.TestEJBLocal"/>
</ejbService>
<ejbService name="calculator" >
<jndi name="CalculatorEJB3" />
<interface class="com.jdon.framework.test.service.Calculator" />
</ejbService>
Annonation支持
EJB3、JPA以及整個(gè)JavaEE5都已經(jīng)大量引入的java5的annonation來(lái)描述源數(shù)據(jù),spring、struts2、hibernate以及國(guó)內(nèi)的operamasks、easyjweb等框架也都大量引入了對(duì)annonation的支持,實(shí)踐證明annonation也是一個(gè)非常好的東西。而到上前為止,在這一方面jdon框架中還沒(méi)有看到有對(duì)annonation的支持。最好能把ejbService、pojoService及component等配置可以通過(guò)簡(jiǎn)單的注解來(lái)實(shí)現(xiàn),甚至cache、攔截器等也應(yīng)該引入annonation的支持。
其它Web框架支持
雖然Struts1.x的市場(chǎng)仍然還是很大,但我們應(yīng)該清醒地看到,今天已經(jīng)有很多正在逐漸取代Struts1.x的Web框架出現(xiàn),比如webwork(或struts2)、easyjweb、operamasks(jsf)、grails等。Jdon作為一個(gè)應(yīng)用框架,要能獲得更多的應(yīng)用支持,必須支持與這些框架進(jìn)行集成,提供更多的支持,讓開(kāi)發(fā)者有更多的選擇權(quán)。
持久層JPA支持
JPA不用質(zhì)疑肯定是一個(gè)趨勢(shì),spring、grails、appfuse、struts2、jsf等當(dāng)前主流的框架都提供了對(duì)jpa全面的支持,并且把jpa作為java持久層的首選解決方法。另外, springside、easyjf等國(guó)內(nèi)的開(kāi)源組織,都已經(jīng)在他們的框架中大量的使用到了jpa持久層技術(shù)。因此,Jdon也應(yīng)該提供更多的對(duì)Jpa的支持。jdon現(xiàn)在所提供的對(duì)持久層的封裝顯得較單薄,很多時(shí)候無(wú)法滿(mǎn)足項(xiàng)目中需求。
過(guò)分EJB不一定是好事
EJB是一個(gè)好東西,但EJB3以后EJB從技術(shù)上來(lái)說(shuō)應(yīng)該就不算是什么東西了。三年前的Jdon考慮到當(dāng)時(shí)對(duì)EJB的支持情況,過(guò)分考慮EJB的需求是對(duì)的。但都EJB都已經(jīng)從重量變化輕量了,jdon框架中的很多為支持EJB而提供接口、方法等應(yīng)該根據(jù)實(shí)現(xiàn)的情況作相應(yīng)的調(diào)整、改進(jìn),不用再“過(guò)分EJB”。比如,下圖是Jdon中的TargetMetaDef組件定義核心接口的類(lèi)結(jié)構(gòu)圖:
6、寫(xiě)在最后
也許真像就像我在
《中國(guó)java開(kāi)源界最可愛(ài)的人們》中說(shuō)過(guò)的一樣,Jdon現(xiàn)在給人有點(diǎn)高處不勝寒的感覺(jué)。然而我更希望的是Jdon不要停止前進(jìn)的步伐,同時(shí)也希望更多人一起來(lái)為Jdon以后的發(fā)展、為國(guó)人的開(kāi)源做出力所能及的貢獻(xiàn)。擁抱開(kāi)源肯定是不會(huì)錯(cuò)的,能投身到開(kāi)源的事業(yè)中當(dāng)然就會(huì)讓我們的職業(yè)生涯更加有意義的。
泡一杯清茶,細(xì)品Jdon中的代碼,他可以帶給你很多東西。程序是一種藝術(shù),藝術(shù)不一定都實(shí)用,他能帶給我們藝術(shù)享受就已經(jīng)足夠。
也許我們永遠(yuǎn)都用不到這框架,也許幾年以后,你會(huì)發(fā)現(xiàn)編程的技術(shù)又有翻天覆地的變化,如果你發(fā)現(xiàn)你為這種變化做出了一些貢獻(xiàn),你會(huì)感到非常欣慰。從這一點(diǎn)來(lái)說(shuō),我認(rèn)為板橋無(wú)論如何肯定都是應(yīng)該是快樂(lè)的。
版權(quán)聲明:本文版權(quán)由Blogjava的小雨開(kāi)源所有,受法律保護(hù)。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留作者版權(quán)聲明及連接。
附:
其它相關(guān)背景資料:
- 2005年Jdon框架入選SUN公司的Java.net企業(yè)應(yīng)用目錄(與AppFuse同列)。
- Jdon框架在全世界最大開(kāi)源網(wǎng)站Sourceforge的項(xiàng)目網(wǎng)址
- 世界頂級(jí)Java網(wǎng)站TheServerSide有關(guān)Jdon框架 2004年新聞1 新聞2
- 2004年底Jdon框架剛推出時(shí)國(guó)內(nèi)各種評(píng)論
- 時(shí)值2006年8月道友lhsail對(duì)Jdon框架的看法。
- 一位Jdon框架用戶(hù)的感言
- 對(duì)話Jdon
一個(gè)開(kāi)源人的孤獨(dú)告白.
- 更多關(guān)于JdonFramework討論系列1 以及 討論系列2