<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sung in Blog

               一些技術(shù)文章 & 一些生活雜碎

    最近,Spring很熱鬧,因?yàn)閷?shí)現(xiàn)IoC模式和AOP(見本站專欄),然后又成立公司,吸取上次JBoss的教訓(xùn),文檔不敢收費(fèi),結(jié)果迎來了一片祝賀聲。

      Spring真正的精華是它的Ioc模式實(shí)現(xiàn)的BeanFactory和AOP,它自己在這個(gè)基礎(chǔ)上延伸的功能有些畫蛇添足。

      其實(shí)說白了,大家"驚奇"的是它的IoC模式(使用AOP功能需要了解AOP,比較難),那么,Spring之類的Ioc模式是什么? 就是:你在編制程序時(shí),只要寫被調(diào)用者的接口代碼,具體子類實(shí)例可通過配置實(shí)現(xiàn)。

      Ioc模式是什么知道的人不多,但是,當(dāng)他知道生成對象不用再使用new了,只要在配置文件里配置一下,他感到新鮮,其實(shí)這就是Ioc模式的實(shí)現(xiàn),PicoContainer是另外一種真正輕量的Ioc模式實(shí)現(xiàn),PicoContainer還是采取代碼將對象注射一個(gè)小容器中,而Spring采取配置文件。

      配置式編碼其實(shí)有利有弊,編碼本來可通過開發(fā)工具或編譯器檢查錯(cuò)誤,但是過分依賴配置時(shí),就會(huì)經(jīng)常出現(xiàn)因?yàn)榇中膶?dǎo)致的小錯(cuò)誤,如果調(diào)試程序出錯(cuò)經(jīng)常是因?yàn)榕渲梦募行懽帜笇懗纱髮懽帜福恢滥闶窃趺葱那椋?/P>

      Spring最近還發(fā)表了Spring without EJB的書,這倒是說了實(shí)話,Spring和EJB其實(shí)是相競爭,如同黑與白,如果硬是將兩者搭配使用,顯得不協(xié)調(diào),更不是一些人所謂優(yōu)化EJB調(diào)用的謠言,原因下面將會(huì)分析。既然Spring+EJB有缺陷,那么就直接使用Spring+Hibernate架構(gòu),但是又帶來了新問題:無集群分布式計(jì)算性能,只能在一臺機(jī)器上運(yùn)行啊,具體分析見:可伸縮性和重/輕量,誰是實(shí)用系統(tǒng)的架構(gòu)主選?

      下面來分析所謂Spring+EJB的不協(xié)調(diào)性,正如水和油攪拌在一起使用一樣。
      目前,Spring+EJB有兩種應(yīng)用方式:

      1. Spring不介入EJB容器,只做Web與EJB之間的接口,這個(gè)位置比較尷尬,Web層直接調(diào)用EJB的方法比較直接快捷,為什么要中間加個(gè)Spring?可實(shí)現(xiàn)Web緩存?使用性能更好的AOP框架aspectwerkz啊;實(shí)現(xiàn)Web和EJB解耦?這樣的工具更多,自己都可以做個(gè)小框架實(shí)現(xiàn),就不必打擾背著AOP和IOC雙重重?fù)?dān)的Spring了吧。

      2. Spring介入EJB容器,這時(shí),需要在你的ejb-jar.xml中配置beanFactoryPath值指向你為EJB配置的applicationContext.xml,那么你的EJB還需要繼承Spring的SimpleRemoteStatelessSessionProxyFactoryBean。

      好了,現(xiàn)在你的SLSB(無狀態(tài)Session Bean)成為下面這個(gè)樣子:

      void updateUser(){
        
          myService.updateUser(); //委托給一個(gè)POJO的方法,真正業(yè)務(wù)邏輯封裝在這個(gè)POJO中

      }

      這樣做有很多“優(yōu)點(diǎn)”,當(dāng)然最大“優(yōu)點(diǎn)”是:

      由于真正業(yè)務(wù)核心在POJO中實(shí)現(xiàn),因此,只要改一下applicationContext.xml配置,這樣,調(diào)試時(shí),前臺就可以直接調(diào)用POJO,不必通過EJB,調(diào)試起來方便了,這有一個(gè)前提:他們認(rèn)為調(diào)試EJB復(fù)雜,其實(shí)不然,在JBuilder中,結(jié)合Junit,測試EJB如同測試POJO一樣方便,這是其他分支,不在此討論。當(dāng)部署使用時(shí),再改一下applicationContext.xml配置,指引前臺調(diào)用到EJB。

      似乎很巧妙,這里有兩個(gè)疑問,首先,指引到EJB的改變是什么時(shí)候做?持續(xù)集成前還是后,在前在后都有問題,這里不仔細(xì)分析。

      這種表面巧妙的優(yōu)點(diǎn)帶來最大的問題是:粗粒度事務(wù)機(jī)制。所謂粗粒度事務(wù)機(jī)制,最早見于Petstore的WEB調(diào)用EJB Command模式,在這個(gè)帖子中有討論。

      下面以代碼描述什么是粗粒度事務(wù)機(jī)制:

      ejb方法:
      public void updateUser(){
        service.updateUser();
      }

      service是一個(gè)POJO,具體方法可能是更新兩個(gè)表:
      public void updateUser(){
        updateTabel1();//更新table1
        updateTable2(); //更新table2
      }

      當(dāng)updateTable2()拋出異常,updateTable1()是不回滾的。這樣,table1中就有一條錯(cuò)誤的多余的記錄,而table2則沒有這條記錄。

      那么,怎么做才能使兩個(gè)表記錄一致,采取事務(wù)機(jī)制,只有下面這樣書寫才能實(shí)現(xiàn)真正事務(wù):
    在EJB方法中寫兩個(gè)方法,因?yàn)镋JB方法體缺省是一個(gè)事務(wù)。
      public void updateUser(){
        updateTabel1();//更新table1
        updateTable2(); //更新table2
      }

      關(guān)于EJB自動(dòng)的事務(wù)機(jī)制,最近也有一個(gè)道友做了測試,對于JBoss中容器管理的事務(wù)的疑惑。

      如果你從事關(guān)鍵事務(wù),就是帶money相關(guān)操作的事務(wù),這種粗粒度機(jī)制可能害苦你,那么,似乎有一種辦法可彌補(bǔ)事務(wù),不使用EJB容器事務(wù)(CMT),在service中使用Spring的事務(wù)機(jī)制。

      如果使用Spring事務(wù)機(jī)制,業(yè)務(wù)核心又在POJO中實(shí)現(xiàn),那么我有一個(gè)疑問:還要套上EJB干什么?至此,你終于明白,Spring本質(zhì)是和EJB競爭的,如果硬套上EJB使用,只是相借助其集群分布式功能,而這個(gè)正是Spring目前所缺少的。

      我太驚異Spring精巧的詭異了,他和EJB關(guān)系,正如異型和人的關(guān)系一樣。

      為了避免你每次使用Spring時(shí)想到粘糊糊的異型,不如Spring without EJB,這也正是Spring的初衷,也是它的一個(gè)暢銷書名。

    ?

    posted on 2005-10-20 15:29 Sung 閱讀(215) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 免费又黄又爽又猛的毛片| 久久久久亚洲AV片无码| 热久久这里是精品6免费观看| 亚洲综合偷自成人网第页色| 成人奭片免费观看| 一级毛片成人免费看a| 亚洲高清在线视频| 免费高清在线影片一区| 成人av片无码免费天天看| 亚洲女人初试黑人巨高清| 免费国产成人高清视频网站| 华人在线精品免费观看| 亚洲综合国产成人丁香五月激情| www亚洲一级视频com| 亚洲网站在线免费观看| sihu国产精品永久免费| 亚洲男人天堂2022| 亚洲阿v天堂在线| 日韩一品在线播放视频一品免费| 暖暖在线视频免费视频| 亚洲av日韩综合一区久热| 亚洲AV无码久久寂寞少妇| 亚洲av日韩av欧v在线天堂| h视频在线观看免费完整版| 国产黄片不卡免费| 亚洲色中文字幕在线播放| 情人伊人久久综合亚洲| 国产免费私拍一区二区三区| **一级一级毛片免费观看| 国产va免费精品| 精品特级一级毛片免费观看| 亚洲中文字幕无码av在线| 亚洲欧洲日产国码av系列天堂 | 亚洲国产成人资源在线软件| 亚洲午夜精品第一区二区8050| 国产桃色在线成免费视频| 亚洲a一级免费视频| 久久一区二区免费播放| 理论片在线观看免费| 精品国产日韩久久亚洲| 亚洲六月丁香六月婷婷蜜芽|