在我Support過的許多BEA客戶里面,80%依然使用EJB2,20%已經(jīng)開始使用Spring,但幾乎沒有看到有真實的大客戶在關(guān)鍵系統(tǒng)中使用 EJB3,EJB3的技術(shù)其實已經(jīng)很成熟,在分布式能力上,WebLogic EJB2.0容器經(jīng)過10年的改進,在分布式性能以及穩(wěn)定性方面,已經(jīng)相當(dāng)成熟,強大的JMX支持亦為WebLogic贏得更多的商業(yè)用戶。盡管EJB2 的復(fù)雜性,但BEA畢竟將這些復(fù)雜性降至最低,比如通過WebLogic的Ant Task擴展,weblogic.ejb.GenericSessionBean等等,但這一切依然沒有解決無接口不OO的尷尬局面(EJB3做到了真正的POJO化,即ReviewManagerBean是implements ReviewService,POJOer舒了一口氣),且IDE工具的重構(gòu)也更加容易直觀。
EJB3的Annotation改善了POJOer的Coding狀況,卻沒有增加EJB容器廠家很多的工作量。各個中間件廠商依然使用他們原有的EJB CodeBase作為EJB3的基礎(chǔ),因此,我們完全信任EJB3的穩(wěn)定性和可靠性。
在中間件廠家的角度,EJB3其實可以分為兩個部分:
A1,Session Bean、MDB領(lǐng)域【具有分布式容器依賴性】
A2,持久層實現(xiàn)(JPA)【對分布式容器無依賴性】
在 A1領(lǐng)域,中間件廠家更關(guān)注于屬于容器的范疇,即比如為笨重的EJB2容器添加DI能力,無論是Annotation還是XML描述符,都額外簡單;你可能有疑問,這些DI是否會增加容器設(shè)計的復(fù)雜性嗎? 顯然不會。據(jù)我所知,為了支持EJB3后,WebLogic容器的重構(gòu)了大量的EJB2代碼,從weblogic.ejb20抽出了大量的EJB內(nèi)部接口到weblogic.ejb Package去,且僅僅改寫了部分的內(nèi)部類,于是,我們會看到內(nèi)核中包含了一些beaninfo.isEjb3的條件分支的判斷。
至于MDB,WebLogic 11g之后會融合更強的Oracle JMS Provider實現(xiàn),性能和可靠性絕對會讓人耳目一新。
A2,很久以前,WebLogic明顯花了很大的力氣去實現(xiàn)Entity Bean,它太難用了,幾乎毫無學(xué)習(xí)的必要,KODO隨后被BEA收購,并派生一個OpenJPA的開源項目(輸給了Oracle的TopLink Essential開源項目),Oracle收購BEA之后,可能會將TopLink重新融入到WebLogic默認實現(xiàn)中,之前使用KODO結(jié)合 Spring的被發(fā)現(xiàn)很多運行時問題(困擾了我很久,后來索性換成TopLink Essential),可以讓開發(fā)者大為放心。有著10多年歷史、業(yè)界領(lǐng)先的TopLink作為WebLogic EJB容器的一部分(JPA Provider方式),它的穩(wěn)定性也是有目共睹的;另外,要提到的是,TopLink包含了Runtime監(jiān)控的特性,Oracle移植TopLink 到Weblogic11g的時候亦會包含它為OC4J提供的TopLink Runtime Monitor特性,這些特性是容器依賴的,但并不是必須。
對 EJB3的客戶而言,Codebase的穩(wěn)定性是非常重要的,從EJB2->EJB3,WebLogic并沒有改變太多的EJB核心設(shè)計,從而保證了EJB2客戶遷移到EJB3所帶來的可靠性;另外,持久層方面,從KODO過渡到TopLink,ORM的穩(wěn)定性和性能亦會有一個不少的飛躍??傊?,WebLogic 11g是值得期待的一個強大的EJB3版本。