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

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

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

    J2EE之巔

     

    懶對(duì)象加載模式

     

    問題

    隨著輕量級(jí)持久化框架的流行(如:HibernateJDOJPA),領(lǐng)域?qū)ο笕〈藗鹘y(tǒng)的DTO直接作為值對(duì)象,而在這種架構(gòu)應(yīng)用的開發(fā)過程中,開發(fā)人員常會(huì)預(yù)見這樣的異常LazyInitializationException。上述問題是由于Hibernate對(duì)于領(lǐng)域?qū)ο蟮年P(guān)系域?qū)ο蟛扇×藨屑虞d策略所導(dǎo)致的(即在關(guān)系域被訪問時(shí)才真正加載創(chuàng)建這些相關(guān)對(duì)象,Hibernate提供的懶加載策略在很多時(shí)候都可以讓我的程序獲得更高的效率);由于領(lǐng)域?qū)ο笤诿摴艿臓顟B(tài)下被作為值對(duì)象傳回顯示層,而顯示層如果訪問了采用懶加載策略加載的關(guān)系域,便會(huì)導(dǎo)致LazyInitializationException異常。

    為了避免這個(gè)問題,我們常常會(huì)在Façade層的業(yè)務(wù)方法中加入與特定顯示要求相綁定的返回對(duì)象初始化過程(即裝載那些被懶加載了的關(guān)系域?qū)ο螅?/span>Façade通常是我們用于控制事務(wù)邊界和完成返回的領(lǐng)域?qū)ο竺撱^的地方。

    1 表現(xiàn)層是易變的這樣就會(huì)導(dǎo)致連鎖反應(yīng),大量的代碼需要維護(hù),完全違背了面向?qū)ο笤O(shè)計(jì)的原則,增加了程序的維護(hù)成本。

    2 并且Façade可能用于支持多種不同的表現(xiàn)層,很難讓一個(gè)方法滿足不同的要求。

    OSIVOpen Session in View)結(jié)構(gòu)是一種解決上述問題的方法,這種結(jié)構(gòu)之所以能解決上述問題關(guān)鍵就在于OSIV在表現(xiàn)層中控制Session的打開和關(guān)閉,控制事務(wù)邊界。OSIV雖然簡(jiǎn)化了應(yīng)用程序的結(jié)構(gòu),也避免了LazyInitializationException問題,但是也有很多不足:1.增加了表示層的負(fù)責(zé)度,2.在響應(yīng)返回表示層前必須提交事務(wù)。3.由于減少了封裝層次,表現(xiàn)層直接操作領(lǐng)域?qū)ο笫沟冒ㄐ阅芊矫娴母鞣N優(yōu)化更為困難。

    解決方案

    思考既然表示層知道要顯示的信息,即領(lǐng)域?qū)ο髴?yīng)該加載哪些相關(guān)聯(lián)的對(duì)象。那么我們何不把這個(gè)任務(wù)交給Façade的調(diào)用者(表現(xiàn)層)來完成呢?

    不同的表示層可能會(huì)有不同的顯示策略,利用策略模式(GoF)我們讓表示層來注入所需的關(guān)系域加載策略實(shí)現(xiàn)。

    下面便是這個(gè)想法的實(shí)現(xiàn):

    示例中的領(lǐng)域模型:


    圖表
    1示例中領(lǐng)域?qū)ο竽P?/span>

    示例中相關(guān)的組件


    圖表
    2示例相關(guān)組件

    LazyObjectLoader:懶對(duì)象加載者接口,其定義如下

    來對(duì)象加載策略接口

    package org.ccsoft;

    publicinterface LazyObjectLoader {

        publicvoid loadLazyObjects(Object obj);

    }

    該接口定義了不同懶對(duì)象加載策略實(shí)現(xiàn)者要實(shí)現(xiàn)的方法,在loadLazyObjects方法中實(shí)現(xiàn)對(duì)領(lǐng)域?qū)ο?/span>obj相關(guān)的關(guān)系域?qū)ο筮M(jìn)行加載的策略。

    OrderItemLoader一種加載策略的實(shí)現(xiàn),用于加載Order對(duì)象的關(guān)系域?qū)ο?/span>OrderItem對(duì)象

    package org.ccsoft;

    import java.io.Serializable;

    publicclass OrderItem implements Serializable {

       

        private String detail;

        public String getDetail() {

           returndetail;

        }

        publicvoid setDetail(String detail) {

           this.detail = detail;

        }

       

    }

    OrderMgrFacadeImp: Façade的實(shí)現(xiàn),可以使POJO也可以使Session Bean

    package org.ccsoft;

    publicclass OrderMgrFacadeImp implements OrderMgrFacade {

        private OrderDAO orderDAO;

        public OrderDAO getOrderDAO() {

           returnorderDAO;

        }

        publicvoid setOrderDAO(OrderDAO orderDAO) {

           this.orderDAO = orderDAO;

        }

        public Order getOrder(int orderId, LazyObjectLoader loader) {

           Order order=orderDAO.getOrder(orderId);

           loader.loadLazyObjects(order);

           return order;

        }

       

    }

    getOrder方法中我們要求調(diào)用者提供了懶對(duì)象裝載策略的實(shí)例用于裝載那些調(diào)用者要用到的關(guān)系域?qū)ο蟆W⒁庠撌纠峭ㄟ^spring實(shí)現(xiàn)的,利用spring AOP完成事務(wù)管理,事務(wù)的邊界在Façade中方法上,當(dāng)方法執(zhí)行結(jié)束,事務(wù)業(yè)務(wù)將結(jié)束,并且Hibernate會(huì)自動(dòng)關(guān)閉session,我們看到getOrder方法中在事務(wù)結(jié)束前調(diào)用了懶對(duì)象裝載策略,從而按照調(diào)用者的要求裝載了調(diào)用者所需的關(guān)系域?qū)ο蟆?/span>

    該模式的優(yōu)點(diǎn)

    1 將領(lǐng)域?qū)ο蟮奶幚磉壿嬇c顯示層的顯示邏輯完全分離,提高了代碼的可維護(hù)性和可擴(kuò)展性

    該模式的不足

    1 要求顯示層的開發(fā)者,了解懶加載的情況

    2 增加了代碼的復(fù)雜性

    ________________________________________________________________________

    SCEA SCBCD MCSD
    IBM Certified Specialist RUP
    IBM Certified Solution Designer OOA&D UML v2
    北京天融信軟件架構(gòu)師
    SUN,Microsoft培訓(xùn)中心特邀高端教師
    常年提供架構(gòu)咨詢服務(wù)
    chaocai2001@yahoo.com.cn 010-82776427



    posted on 2007-09-20 21:28 超越巔峰 閱讀(1540) 評(píng)論(1)  編輯  收藏

    評(píng)論

    # re: 懶對(duì)象加載模式 2007-09-20 22:41 千里冰封

    這不失為一種好方法:)  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(12)

    隨筆分類(54)

    隨筆檔案(59)

    文章分類(2)

    文章檔案(1)

    相冊(cè)

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲 日韩经典 中文字幕| 一本到卡二卡三卡免费高| 国产免费人视频在线观看免费| 老司机午夜在线视频免费观| 日韩亚洲欧洲在线com91tv| h视频在线观看免费完整版| 亚洲av成本人无码网站| 亚洲AV无码专区在线播放中文| 国产成人免费爽爽爽视频 | 亚洲色无码专区在线观看| 久久久久久毛片免费播放| 国产精品国产亚洲区艳妇糸列短篇| 狠狠色婷婷狠狠狠亚洲综合| 亚洲一区免费在线观看| 男女男精品网站免费观看| 亚洲美女激情视频| 亚洲精品97久久中文字幕无码| 日本人的色道免费网站| 国产免费AV片在线观看播放| 久久精品国产亚洲αv忘忧草| 久久国产成人精品国产成人亚洲 | 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲精品国产suv一区88| 国产精品亚洲片在线| 老司机永久免费网站在线观看| 欧洲人成在线免费| 黄色免费网址大全| tom影院亚洲国产一区二区| 亚洲综合色自拍一区| 国产精品免费综合一区视频| 91高清免费国产自产| 国产在线国偷精品免费看| 久久亚洲中文字幕无码| 亚洲国产中文在线二区三区免| 亚洲精品高清无码视频| 亚洲国产精品不卡毛片a在线| 无码专区永久免费AV网站| 亚洲午夜免费视频| 国产在线播放线91免费| 成年大片免费高清在线看黄| 亚洲精品无码av片|