今天TSS和InfoQ都轉(zhuǎn)了一篇Spring與EJB3的讀后感,我就看了下,標(biāo)題和介紹滿吸引人的。內(nèi)容嘛其實(shí)有點(diǎn)不過癮,但是先記錄下來吧。
http://www.devx.com/Java/Article/32314/0/page/1
總的來看Spring+Hibernate與JPA很相似,它們都是基于pojo的持久化。
Hibernate Session和JPA Entity Manager基本上等價(jià),但是要記住他們的兩個(gè)重要區(qū)別。Hibernate session是一個(gè)實(shí)體緩存也是一個(gè)ORM引擎的接口。而JPA中這兩個(gè)概念是分開的。Persistence context作為緩存而entity manager則作為ORM引擎的接口。
當(dāng)然還有顯而易見的區(qū)別,Spring+Hibernate偏向使用XML配置映射,而JPA偏向使用Annotation,雖然兩者都有XML和注釋兩種實(shí)現(xiàn)。
還有,JPA是一個(gè)標(biāo)準(zhǔn),而Spring是對不同實(shí)現(xiàn)的抽象,兩者的方向是不同的。JPA的方式更徹底,Java傳統(tǒng)中都是這樣的。
JPA的主要商業(yè)實(shí)現(xiàn)有Hibernate、Kodo、Toplink,被巨鱷們看好。
后面,說到了關(guān)于Cache和Transaction管理的問題,由于Spring的草根特性,為了兼容實(shí)現(xiàn),它使用Tread local這種編程式的方式。而EJB 3.0則由容器自動(dòng)完成這些過程。而且EJB 3.0提供了不同的persistence context范疇,可以比較方便的管理持久數(shù)據(jù)的生命周期。不過,這個(gè)觀點(diǎn)很難說,因?yàn)槿绻惆裇pring也看成一種容器,那么這Thread local對于你來說也是透明的,可以認(rèn)為差不多。
關(guān)于EJB 3.0對生命周期的規(guī)定,讓持久化的概念更清楚了,如果這些東西能夠通過聲明而不是編碼來實(shí)現(xiàn)應(yīng)該是愜意的,可是,問題就是很多程序員一般就喜歡自己控制,不喜歡那么透明,所以EJB一直以來興建的這些漂亮模型總是只有少數(shù)人使用,不是么?
在事務(wù)方面,由于兩者都支持生命性事務(wù),所以程序本身看起來基本一樣。
區(qū)別在于配置。Spring還是偏向XML,并且事務(wù)作為Spring對AOP應(yīng)用的經(jīng)典樣例,transaction完全作為附加語義,可以通過配置替換各種事務(wù)實(shí)現(xiàn),從JDBC、Hibernate到JTA,顯然這是從編程者角度考慮的,門檻很低。
而EJB 3.0則只支持JTA,這就需要容器的支持,當(dāng)然跨多資源的事務(wù)往往是企業(yè)級項(xiàng)目的特性,所以這種思路可以理解。而且現(xiàn)在也有很多開源的JTA實(shí)現(xiàn)了,它們完全可以讓你的應(yīng)用在商業(yè)EJB容器外運(yùn)行。還要提一點(diǎn),EJB3默認(rèn)是配置上事務(wù)的,需要聲明才可覆蓋,這說明了EJB3對于企業(yè)應(yīng)用的態(tài)度。
在JTA事務(wù)可以通過聲明就以橫切關(guān)注點(diǎn)的形勢注入的時(shí)候,JTA的成本已經(jīng)下降了,所以一開始就用這種API完全可行。
這篇文章中關(guān)于狀態(tài)的地方我有點(diǎn)不太理解,里面說Spring的prototype等價(jià)于EJB的SFSBs,實(shí)現(xiàn)stateful。
EJB 3.0在這方面無疑是強(qiáng)大的,因?yàn)楸旧碓谶@方面它就是個(gè)容器規(guī)范,Java EE容器都會提供這種高級的生命周期管理,并且把生命周期作為變成模型中非常重要的一部分。所以結(jié)果就是EJB 3.0在這方面領(lǐng)先于Spring,聲名簡單,并且從實(shí)現(xiàn)的方式上來說,EJB 3.0在性能上和可伸縮性上有明顯的優(yōu)勢。Spring在性能伸縮或者說分布部署的時(shí)候應(yīng)該說是捉襟見肘的,Terracotta也許可以解決些,但還……
應(yīng)該說,實(shí)際上Spring提供的prototype就是new的另外一種實(shí)現(xiàn),只不過它會經(jīng)過Spring裝配,所以它叫做prototype,也就是“原型”,Spring每次回new出一個(gè)新的,按你的要求。當(dāng)然,由于是類似new,所以Spring通過代理的方式管理起生命周期,也就能模擬出session、request、global session的statefull,不過這些功能顯然不算強(qiáng)項(xiàng),在Spring 2.0中加強(qiáng)了(以前只有singleton和prototype),但依然不支持事務(wù)范疇,這就明顯不如EJB 3.0了。但是,回想Spring的編程哲學(xué),它不要解決這種問題,這種問題留給容器解決:D
文章最后的總結(jié)比較官腔,基本上就是在說Spring靈活,EJB 3.0強(qiáng)大簡單,它們各有優(yōu)缺點(diǎn),所以應(yīng)該結(jié)合起來使用,具體大家可以看看原文。
http://www.devx.com/Java/Article/32314/0/page/1
總的來看Spring+Hibernate與JPA很相似,它們都是基于pojo的持久化。
Hibernate Session和JPA Entity Manager基本上等價(jià),但是要記住他們的兩個(gè)重要區(qū)別。Hibernate session是一個(gè)實(shí)體緩存也是一個(gè)ORM引擎的接口。而JPA中這兩個(gè)概念是分開的。Persistence context作為緩存而entity manager則作為ORM引擎的接口。
當(dāng)然還有顯而易見的區(qū)別,Spring+Hibernate偏向使用XML配置映射,而JPA偏向使用Annotation,雖然兩者都有XML和注釋兩種實(shí)現(xiàn)。
還有,JPA是一個(gè)標(biāo)準(zhǔn),而Spring是對不同實(shí)現(xiàn)的抽象,兩者的方向是不同的。JPA的方式更徹底,Java傳統(tǒng)中都是這樣的。
JPA的主要商業(yè)實(shí)現(xiàn)有Hibernate、Kodo、Toplink,被巨鱷們看好。
后面,說到了關(guān)于Cache和Transaction管理的問題,由于Spring的草根特性,為了兼容實(shí)現(xiàn),它使用Tread local這種編程式的方式。而EJB 3.0則由容器自動(dòng)完成這些過程。而且EJB 3.0提供了不同的persistence context范疇,可以比較方便的管理持久數(shù)據(jù)的生命周期。不過,這個(gè)觀點(diǎn)很難說,因?yàn)槿绻惆裇pring也看成一種容器,那么這Thread local對于你來說也是透明的,可以認(rèn)為差不多。
關(guān)于EJB 3.0對生命周期的規(guī)定,讓持久化的概念更清楚了,如果這些東西能夠通過聲明而不是編碼來實(shí)現(xiàn)應(yīng)該是愜意的,可是,問題就是很多程序員一般就喜歡自己控制,不喜歡那么透明,所以EJB一直以來興建的這些漂亮模型總是只有少數(shù)人使用,不是么?
在事務(wù)方面,由于兩者都支持生命性事務(wù),所以程序本身看起來基本一樣。
區(qū)別在于配置。Spring還是偏向XML,并且事務(wù)作為Spring對AOP應(yīng)用的經(jīng)典樣例,transaction完全作為附加語義,可以通過配置替換各種事務(wù)實(shí)現(xiàn),從JDBC、Hibernate到JTA,顯然這是從編程者角度考慮的,門檻很低。
而EJB 3.0則只支持JTA,這就需要容器的支持,當(dāng)然跨多資源的事務(wù)往往是企業(yè)級項(xiàng)目的特性,所以這種思路可以理解。而且現(xiàn)在也有很多開源的JTA實(shí)現(xiàn)了,它們完全可以讓你的應(yīng)用在商業(yè)EJB容器外運(yùn)行。還要提一點(diǎn),EJB3默認(rèn)是配置上事務(wù)的,需要聲明才可覆蓋,這說明了EJB3對于企業(yè)應(yīng)用的態(tài)度。
在JTA事務(wù)可以通過聲明就以橫切關(guān)注點(diǎn)的形勢注入的時(shí)候,JTA的成本已經(jīng)下降了,所以一開始就用這種API完全可行。
這篇文章中關(guān)于狀態(tài)的地方我有點(diǎn)不太理解,里面說Spring的prototype等價(jià)于EJB的SFSBs,實(shí)現(xiàn)stateful。
EJB 3.0在這方面無疑是強(qiáng)大的,因?yàn)楸旧碓谶@方面它就是個(gè)容器規(guī)范,Java EE容器都會提供這種高級的生命周期管理,并且把生命周期作為變成模型中非常重要的一部分。所以結(jié)果就是EJB 3.0在這方面領(lǐng)先于Spring,聲名簡單,并且從實(shí)現(xiàn)的方式上來說,EJB 3.0在性能上和可伸縮性上有明顯的優(yōu)勢。Spring在性能伸縮或者說分布部署的時(shí)候應(yīng)該說是捉襟見肘的,Terracotta也許可以解決些,但還……
應(yīng)該說,實(shí)際上Spring提供的prototype就是new的另外一種實(shí)現(xiàn),只不過它會經(jīng)過Spring裝配,所以它叫做prototype,也就是“原型”,Spring每次回new出一個(gè)新的,按你的要求。當(dāng)然,由于是類似new,所以Spring通過代理的方式管理起生命周期,也就能模擬出session、request、global session的statefull,不過這些功能顯然不算強(qiáng)項(xiàng),在Spring 2.0中加強(qiáng)了(以前只有singleton和prototype),但依然不支持事務(wù)范疇,這就明顯不如EJB 3.0了。但是,回想Spring的編程哲學(xué),它不要解決這種問題,這種問題留給容器解決:D
文章最后的總結(jié)比較官腔,基本上就是在說Spring靈活,EJB 3.0強(qiáng)大簡單,它們各有優(yōu)缺點(diǎn),所以應(yīng)該結(jié)合起來使用,具體大家可以看看原文。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請注明來處和原文作者。非常感謝。