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

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

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

    J2EE之巔

     

    如何在程序中直接使用Spring的工具類

    Spring中存在大量的工具類,如:RMI相關的。Spring所提供的 RMI的支持大大簡化了RMI的開發難度,不過通常我們都是采用配置的方式,通過標準的spring bean來使用它們,這樣雖然簡化了開發,但是也限制了一些靈活性。因為bean的屬性都是在配置時設定的(如RMI客戶端中的服務的URL),而有時我 們需要在運行時生成這些屬性,這時其實只要我們直接使用這些工具類就可以了。
    要在程序中直接使用RmiProxyFactoryBean,我們就必須了解spring是如何使用這個類為我們生成客戶端代理的,然后在程序中使用與spring相同的調用方式。
    RmiProxyFactoryBean是一個工廠類,平時我們通過spring獲得的并不是這個工廠類的實例,而是用這個工廠類創建的proxy的實例,這個類實現了spring中標準的FactoryBean接口。FactoryBean接口中定義了三個方法:
    getObject()
               Return an instance (possibly shared or independent) of the object managed by this factory.
    getObjectType()
               Return the type of object that this FactoryBean creates, or
    null if not known in advance.
    boolean
    isSingleton()
               Is the bean managed by this factory a singleton or a prototype?
    我們通過getBean獲取這類工廠Bean(實現了FactoryBean接口的Bean)時,spring并不會返回工廠類的實例,而是調用工廠類的getObject方法并把方法的返回值返回給我們。
    這樣你就明白了原來我們獲得的RMI的Proxy是通過RmiProxyFactoryBean的getObject方法生成的。
    這時你一定認為下面的程序就可以搞定了:
                  …
    RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();           
                  proxy.setServiceInterface(Calculator.class);
                  proxy.setServiceUrl(url);
                  Calculator client=(Calculator)proxy.getObject();         
                  System.out.println(client.add(1,1));
                  …
    運行程序你會發現上面這段程序并不成功,程序會拋出java.lang.NullPointerException異常。
    問題在哪里呢?研究一下你會發現RmiProxyFactoryBean還實現了spring的InitializingBean接口,接口中包含一個方法afterPropertiesSet(),在所有屬性注入完成后spring會調用這個方法,因此上面的程序并沒有完全正確的模擬spring的調用過程。
    修改代碼:
    RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();           
                  proxy.setServiceInterface(Calculator.class);
                  proxy.setServiceUrl(url);
                  proxy.afterPropertiesSet();
                  Calculator client=(Calculator)proxy.getObject();         
                  System.out.println(client.add(1,1));
                  …
    這次終于成功了!

    最后,此例告訴大家有時我們可以直接調用spring中的工具類,來完成我們的特殊需求,此時要注意的是正確模擬spring的對bean創建和調用過程。

    posted @ 2007-12-26 17:38 超越巔峰 閱讀(1350) | 評論 (0)編輯 收藏

    Spring2.5的組件自動搜索

    http://dev2dev.bea.com.cn/blog/chaocai/200712/spring_osgi_04_719.html

    posted @ 2007-12-04 12:50 超越巔峰 閱讀(2734) | 評論 (1)編輯 收藏

    幫自己的另一個Blog拉拉票

    http://dev2dev.bea.com.cn/bbs/ext/dev2devperson/

    蔡超

    posted @ 2007-11-28 23:00 超越巔峰 閱讀(803) | 評論 (5)編輯 收藏

    多視圖架構文檔編寫的要點

    http://dev2dev.bea.com.cn/blog/chaocai/200710/architecture_24_536.html

    posted @ 2007-11-07 20:07 超越巔峰 閱讀(844) | 評論 (0)編輯 收藏

    黑板模式的常見實現方式

    http://dev2dev.bea.com.cn/blog/chaocai/200711/06_623.html

    posted @ 2007-11-07 08:57 超越巔峰 閱讀(1363) | 評論 (0)編輯 收藏

    我的另一個Blog地址

    http://dev2dev.bea.com.cn/blog/chaocai/

    posted @ 2007-11-05 08:55 超越巔峰 閱讀(580) | 評論 (1)編輯 收藏

    Facade與邊界控制

    多層結構是J2EE應用開發的基本模式,很多開發者都會按照多層結構來組織自己的應用(通常分為Facade,Application Service,DAO等層),但是他們往往會選擇在不同層上去控制事務和Hibernate Session的邊界,可千萬不要小看這樣的選擇它會大大影響程序的可維護性和可復用性。
    其實在Facade層來控制事務的邊界通常都是最佳選擇。我們知道Facade層的粗粒度接口是直接為用戶請求提供相應服務的,在典型的J2EE環境中通常使用Session Bean來實現Facade層,并且使用CMT。這時如果有的開發人員在其他層次控制了事務如DAO,由于這些層次通常不會采用EJB實現,所以所使用的事務為容器提供的用戶管理事務,根據EJB的事務規范CMT是無法把事務上下文傳遞到用戶管理事務的邊界中的,由于J2EE并不支持事務的嵌套,所以當來自Facade的CMT事務遇見DAO的事務時,內部事務將被掛起,這樣整個事務的情況,就會和設想的業務邏輯產生很大的差異。
    并且有時不同業務邏輯的實現會復用DAO提供多個方法,所以很難控制事務的邊界,導致這些方法難以被復用。
    對于Hibernate Session,由于存在懶加載的問題,所以開發人員常會預見這樣的異常LazyInitializationException。避免這個問題就要求在關閉session前要裝載好要使用的對象關系域。而這種邏輯通常只與界面顯示內容相關,如果把session的邊界控制放置在DAO或者Application Service中就會使業務邏輯的實現要和界面顯示邏輯混合在一起,我們必須在這些方法中加載那些界面顯示需要的對象關系域。而界面顯示是經常變化的,并且業務邏輯會被多個不同的界面所復用,如果這樣Application Service,DAO中方法的復用性就會大大降低。
    把這些工作放在離表現層最近的Facade中便可以避免這些問題。
    注意在其他層次中我們不需要控制session的邊界,我們通常采用getCurrentSession()來獲得當前事務中的session,記住這個方法必須在事務上下文存在的情況下才可以調用,并且在事務被提交的時候Hibernate會在自動關閉session,所以我們不要顯示的關閉session.

    posted @ 2007-10-26 10:00 超越巔峰 閱讀(1319) | 評論 (0)編輯 收藏

    SWF一個簡單工作流引擎[支持spring的版本1.3]

    SWF一個簡單工作流引擎

    你是否已經被像JBPM,XFLow等那樣的復雜編程和配置搞頭昏腦脹;被他們所依賴的大量jar和容器搞得不知所措。
    如果這樣就試試筆者開發的這個簡單工作流引擎吧,配置和編程都很簡單,也不依賴任何容器。支持spring的版本。
    下載地址:
    http://m.tkk7.com/Files/chaocai/swf-beta-1[1].3-bin.zip
    內附用戶手冊
    (SWF開發設計:蔡超,北京天融信,chaocai2001@yahoo.com.cn)
     

    簡介

    SWF是一種嵌入式的工作流引擎,它不需要任何應用服務器的支持。SWF使用十分簡單,但卻可以滿足多數流程驅動應用的需求。并且支持和主流j2ee框架整合(spring).

    本文介紹如何基于SWF開發流程驅動的應用。

    posted @ 2007-10-08 17:03 超越巔峰 閱讀(1081) | 評論 (0)編輯 收藏

    SWF一個簡單工作流引擎

    你是否已經被像JBPM,XFLow等那樣的復雜編程和配置搞頭昏腦脹;被他們所依賴的大量jar和容器搞得不知所措。
    如果這樣就試試筆者開發的這個簡單工作流引擎吧,配置和編程都很簡單,也不依賴任何容器。馬上會推出支持spring的版本。
    下載地址:
    http://m.tkk7.com/Files/chaocai/swf-beta-1-bin.zip
    內附用戶手冊
    (SWF開發設計:蔡超,北京天融信,chaocai2001@yahoo.com.cn)
     

    簡介

    SWF是一種嵌入式的工作流引擎,它不需要任何應用服務器的支持。SWF使用十分簡單,但卻可以滿足多數流程驅動應用的需求。

    本文介紹如何基于SWF開發流程驅動的應用。

    posted @ 2007-10-08 10:44 超越巔峰 閱讀(2961) | 評論 (10)編輯 收藏

    懶對象加載模式

     

    問題

    隨著輕量級持久化框架的流行(如:Hibernate,JDO,JPA),領域對象取代了傳統的DTO直接作為值對象,而在這種架構應用的開發過程中,開發人員常會預見這樣的異常LazyInitializationException。上述問題是由于Hibernate對于領域對象的關系域對象采取了懶加載策略所導致的(即在關系域被訪問時才真正加載創建這些相關對象,Hibernate提供的懶加載策略在很多時候都可以讓我的程序獲得更高的效率);由于領域對象在脫管的狀態下被作為值對象傳回顯示層,而顯示層如果訪問了采用懶加載策略加載的關系域,便會導致LazyInitializationException異常。

    為了避免這個問題,我們常常會在Façade層的業務方法中加入與特定顯示要求相綁定的返回對象初始化過程(即裝載那些被懶加載了的關系域對象)。Façade通常是我們用于控制事務邊界和完成返回的領域對象脫鉤的地方。

    1 表現層是易變的這樣就會導致連鎖反應,大量的代碼需要維護,完全違背了面向對象設計的原則,增加了程序的維護成本。

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

    OSIVOpen Session in View)結構是一種解決上述問題的方法,這種結構之所以能解決上述問題關鍵就在于OSIV在表現層中控制Session的打開和關閉,控制事務邊界。OSIV雖然簡化了應用程序的結構,也避免了LazyInitializationException問題,但是也有很多不足:1.增加了表示層的負責度,2.在響應返回表示層前必須提交事務。3.由于減少了封裝層次,表現層直接操作領域對象使得包括性能方面的各種優化更為困難。

    解決方案

    思考既然表示層知道要顯示的信息,即領域對象應該加載哪些相關聯的對象。那么我們何不把這個任務交給Façade的調用者(表現層)來完成呢?

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

    下面便是這個想法的實現:

    示例中的領域模型:


    圖表
    1示例中領域對象模型

    示例中相關的組件


    圖表
    2示例相關組件

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

    來對象加載策略接口

    package org.ccsoft;

    publicinterface LazyObjectLoader {

        publicvoid loadLazyObjects(Object obj);

    }

    該接口定義了不同懶對象加載策略實現者要實現的方法,在loadLazyObjects方法中實現對領域對象obj相關的關系域對象進行加載的策略。

    OrderItemLoader一種加載策略的實現,用于加載Order對象的關系域對象OrderItem對象

    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的實現,可以使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方法中我們要求調用者提供了懶對象裝載策略的實例用于裝載那些調用者要用到的關系域對象。注意該示例是通過spring實現的,利用spring AOP完成事務管理,事務的邊界在Façade中方法上,當方法執行結束,事務業務將結束,并且Hibernate會自動關閉session,我們看到getOrder方法中在事務結束前調用了懶對象裝載策略,從而按照調用者的要求裝載了調用者所需的關系域對象。

    該模式的優點

    1 將領域對象的處理邏輯與顯示層的顯示邏輯完全分離,提高了代碼的可維護性和可擴展性

    該模式的不足

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

    2 增加了代碼的復雜性

    ________________________________________________________________________

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



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

    僅列出標題
    共6頁: 上一頁 1 2 3 4 5 6 下一頁 

    導航

    統計

    常用鏈接

    留言簿(12)

    隨筆分類(54)

    隨筆檔案(59)

    文章分類(2)

    文章檔案(1)

    相冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品国产污污免费网站入口在线| 国产精品高清视亚洲一区二区| 特级无码毛片免费视频| 国产精品视频免费一区二区| 亚洲人成在线播放| 国产香蕉免费精品视频| 亚洲偷自精品三十六区| 天天看免费高清影视| 亚洲AV第一成肉网| 免费一级毛片不卡在线播放| 无码毛片一区二区三区视频免费播放| 免费在线观看理论片| 91福利免费网站在线观看| 亚洲av无码精品网站| 亚洲黄色片免费看| 日韩亚洲国产综合高清| 免费又黄又爽的视频| 中文字幕看片在线a免费| 亚洲国产精品第一区二区| 免费在线观看视频网站| 亚洲成a人无码亚洲成www牛牛| 国产嫩草影院精品免费网址| 一级毛片在播放免费| 亚洲成Av人片乱码色午夜| 免费v片在线观看视频网站| 亚洲日韩国产欧美一区二区三区| 日韩精品无码人妻免费视频| 色爽黄1000部免费软件下载| 亚洲AV午夜成人片| 午夜dj免费在线观看| 国产免费内射又粗又爽密桃视频| 亚洲国产一区国产亚洲 | 中文字幕不卡亚洲| 国产在线观看无码免费视频| 亚洲福利电影一区二区?| 国产精品免费小视频| 久久成人免费大片| 老牛精品亚洲成av人片| 亚洲精品高清无码视频| 嫩草影院免费观看| 任你躁在线精品免费|