http://dev2dev.bea.com.cn/blog/chaocai/200712/spring_osgi_04_719.html
http://dev2dev.bea.com.cn/bbs/ext/dev2devperson/
蔡超
http://dev2dev.bea.com.cn/blog/chaocai/200710/architecture_24_536.html
http://dev2dev.bea.com.cn/blog/chaocai/200711/06_623.html
多層結構是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.
你是否已經被像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開發流程驅動的應用。
你是否已經被像JBPM,XFLow等那樣的復雜編程和配置搞頭昏腦脹;被他們所依賴的大量jar和容器搞得不知所措。
如果這樣就試試筆者開發的這個簡單工作流引擎吧,配置和編程都很簡單,也不依賴任何容器。馬上會推出支持spring的版本。
下載地址:
http://m.tkk7.com/Files/chaocai/swf-beta-1-bin.zip
內附用戶手冊
(SWF開發設計:蔡超,北京天融信,
chaocai2001@yahoo.com.cn)
簡介
SWF是一種嵌入式的工作流引擎,它不需要任何應用服務器的支持。SWF使用十分簡單,但卻可以滿足多數流程驅動應用的需求。
本文介紹如何基于SWF開發流程驅動的應用。
問題
隨著輕量級持久化框架的流行(如:Hibernate,JDO,JPA),領域對象取代了傳統的DTO直接作為值對象,而在這種架構應用的開發過程中,開發人員常會預見這樣的異常LazyInitializationException。上述問題是由于Hibernate對于領域對象的關系域對象采取了懶加載策略所導致的(即在關系域被訪問時才真正加載創建這些相關對象,Hibernate提供的懶加載策略在很多時候都可以讓我的程序獲得更高的效率);由于領域對象在脫管的狀態下被作為值對象傳回顯示層,而顯示層如果訪問了采用懶加載策略加載的關系域,便會導致LazyInitializationException異常。
為了避免這個問題,我們常常會在Façade層的業務方法中加入與特定顯示要求相綁定的返回對象初始化過程(即裝載那些被懶加載了的關系域對象)。Façade通常是我們用于控制事務邊界和完成返回的領域對象脫鉤的地方。
1 表現層是易變的這樣就會導致連鎖反應,大量的代碼需要維護,完全違背了面向對象設計的原則,增加了程序的維護成本。
2 并且Façade可能用于支持多種不同的表現層,很難讓一個方法滿足不同的要求。
OSIV(Open 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