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

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

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

    Thinking in sky

    --老賀的BLOG

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      21 隨筆 :: 0 文章 :: 35 評論 :: 0 Trackbacks
        因為Spring自帶的sample離我們的實際項目很遠,所以官方一點的model層模式展現就靠Appfuse了。

        但Appfuse的model層總共有一個DAO接口、一個DAOImpl類、一個Service接口、一個ServiceImpl類、一個DataObject.....大概只有受慣了虐待的人才會欣然接受吧。
        另外,Domain-Driven逢初一、十五也會被拿出來討論一遍。

        其實無論什么模式,都不過是一種人為的劃分、抽象和封裝。只要在團隊里理解一致,自我感覺優雅就行了。
         我的建議是,一開始DO和Manager一生一旦包演全場,DO作為純數據載體,而Manager類放置商業方法,用 getHibernateTemplate()直接訪問數據庫,不強制基于接口編程。當某天系統復雜到你直覺上需要將DAO層和Service層分開時,再分開就好了。

        1.DataObject類
        
    好聽點也可以叫Domain Object。Domain Driven  Development雖然誘人,但因為Java下的ORM框架都是基于Data Mapper模式的,沒有Ruby On Rails中那種Active Recorder的模式。所以,還是壓下了這個欲望,Data Object純粹作一個數據載體,而把數據庫訪問與商業邏輯操作統一放到Manager類中。

        2.Manager類
        我的Manager類是Appfuse中DAO類與Service類的結合體,因為:

        2.1 不想使用純DAO
         以往的DAO是為了透明不同數據庫間的差異,而現在Hibernate已經做的很好。所以目前純DAO的更大作用是為了將來可以切換到別的ORM方案比如 iBatis,但一個Pragmaic的程序員顯然不會無聊到為了這個機會不大的理由,現在就去做一個純DAO層,項目又不是Appfuse那樣為了 demo各種ORM方案而存在。

        2.2 也不想使用Service層來為Dao解耦
        在JPetStore里有一個很薄的Service層,Fascade了一堆DAO類,把這些DAO類的所有方法都僵硬的重復了一遍。理論上一個 Manager類可以管理數個Dao類,可以避免Dao之間直接耦合。但既然有Manager的情況下,商業邏輯都是寫在Manager類的,那樣子 Manager似乎還是調用另一個Manager比較妥當,調用裸Dao可能存在忽略了某些邏輯。所以,耦合又從Dao層升到Service層了。
         所以,除非你做的是超薄的不帶邏輯的Service層,否則沒有解耦的意義。
        何況,對一個不是死搬書的Designer來說,組件邊界之內的類之間的耦合并不是耦合。

        3.去除不必要的基于接口編程
        眾所周知,Spring是提倡基于接口編程的。
        但有些Manager類,比如SaleOrderManager ,只有5%的機會再有另一個Impl實現。95%時間里這兩兄弟站一起,就像C++里的.h和.cpp,徒增維護的繁瑣(經常要同步兩個文件的函數聲明),和代碼瀏覽跳轉時的不便(比如從Controler類跟蹤到Service類時,只能跳轉到接口類的相應函數,還要再按一次復雜的熱鍵才跳轉到實現類)
        連Martin Flower都說,強制每個類都分離接口和實現是過猶不及。只在有多個獨立實現,或者需要消除對實現類的依賴時,才需要分離接口。

        3.1 DAO被強制用接口的原因
        Spring IOC本身是不會強制基于接口的,但DAO類一般要使用Spring的聲明式事務機制,而聲明式的事務機制是使用Spring AOP來實現的。Spring AOP的實現機制包括動態代理和Cgilib2,其中Spring AOP默認使用的Java動態代理是必須基于接口,所以就要求基于接口了。
        
        3.2 解決方法
        那就讓Spring AOP改用CGLib2,生成目標類的子類吧,我們只要指定使用聲明式事務的FactoryBean使用CGLib的方式來實現AOP,就可以不基于接口編程了。
        指定的方式為設置proxyTargetClass為true。如下:
    <bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    id
    ="baseService"   abstract="true">
      
    <property name="transactionManager" ref="transactionManager"/>
      
    <property name="proxyTargetClass" value="true"/>

    </bean>


    又因為這些Service Bean都是單例,效率應該不受影響。

        4.總結
        對比Appfuse里面的5個類,我的Model層里只有VO作為純數據載體,Manager類放商業方法。有人說這樣太簡單了,但一個應用,要劃成幾個 JSP,一個Controller,一個Manager,一個VO,對我來說已經足夠復雜,再要往上架墻疊屋,恕不奉陪,起碼在我的項目范圍里不需要。 (但有很多項目是需要的,神佑世人)

        后記:迫于世人的壓力,SpringSide暫時還是把DAO和Service層分開了,但依然堅持不搞那么多接口。
    另外,盡量利用IDEA的代碼生成熱鍵,為Manager類生成delegate的Dao類方法。 



    轉自http://blog.csdn.net/qking93415981/archive/2007/08/08/1731676.aspx
    posted on 2007-08-24 09:58 老賀 閱讀(622) 評論(3)  編輯  收藏 所屬分類: J2EE框架

    評論

    # re: 簡化Spring(2)--Model層 2007-08-24 10:06 小賀
    現在的SpringSide 2.0是把DAO和Service合在一起的,不知道以前的版本是怎么做的。 合在一起的類叫做Manager,繼承自范型的DAO,如

    public class UserManager extends HibernateEntityDao<User> {
    // ....CRUD以外的其它商業方法
    }

    以前DAO里的CRUD等基本方法,現在放在了Manager類里而且是不可見的(因為是繼承過來的),這樣Manager里直接寫以前Service里的商業方法,看起來就很清晰了。

    由于采用范型DAO,我們就不需要去寫具體的DAO實現,編碼量就因此減少了很多。  回復  更多評論
      

    # re: 簡化Spring(2)--Model層 2007-08-24 10:13 小賀
    以前做畢業設計時,仿照Appfuse的做法,model層總共有一個DAO接口、一個DAOImpl類、一個Service接口、一個ServiceImpl類、一個DataObject,寫起來確實很麻煩,本來寫的就是個小系統。

    小系統嘛還是SpringSide的Model層簡潔又清晰。其實Appfuse的DAO和Service的概念在SpringSide里還是有的,只是SpringSide把DAO和Service合成了一個Manager。  回復  更多評論
      

    # re: 簡化Spring(2)--Model層[未登錄] 2008-03-18 10:04 vulcan
    google到你的文章,發現我們對于DAO層和Service層的設計想法有些一樣。
    http://vulcan.javaeye.com/admin/blogs/160823
    但是我遇到一個問題,不知道你遇到過沒有,如果要直接對從范型接口繼承來的方法簽名進行聲明式事務,卻總不能成功。不知道兄弟有沒有類似的問題,還是有其他的解決方法?我加你QQ,請教一下。  回復  更多評論
      

    主站蜘蛛池模板: 亚洲AV无码乱码国产麻豆| 日本免费xxxx色视频| 九九九精品视频免费| 免费手机在线看片| xxxx日本在线播放免费不卡| 野花视频在线官网免费1| 精品久久久久久亚洲综合网| 美女被免费视频网站a| 青娱乐在线免费观看视频| 九九免费观看全部免费视频| 一级做a爰片久久免费| 99久久99这里只有免费的精品 | 亚洲人成网站18禁止一区| 亚洲色图综合在线| 亚洲乱码中文字幕久久孕妇黑人| 亚洲一区爱区精品无码| 国产精一品亚洲二区在线播放| 亚洲成AV人片在线观看无| 亚洲黑人嫩小videos| 亚洲人成电影网站| 亚洲AV成人精品一区二区三区| 香港经典a毛片免费观看看| GOGOGO高清免费看韩国| 黄色网址在线免费| 日韩精品极品视频在线观看免费| 一级毛片免费观看不卡的| 中文字幕无码成人免费视频| 日本大片在线看黄a∨免费| 亚洲国产综合久久天堂| 久久亚洲精品中文字幕三区| 亚洲毛片基地日韩毛片基地| 亚洲日本在线电影| 51午夜精品免费视频| 在线观看免费av网站| 大学生高清一级毛片免费| 亚洲精品99久久久久中文字幕| 亚洲国产一区国产亚洲 | 国产亚洲精品资源在线26u| 91亚洲导航深夜福利| 亚洲国产欧美国产综合一区| 亚洲五月午夜免费在线视频|