import java
import java
import java
import java
import com
public final class TransactionWrapper {
/**
* 裝飾原始的業務代表對象
*/
public static Object decorate(Object delegate) {
return Proxy
delegate
delegate));
}
//動態代理技術
static final class XAWrapperHandler implements InvocationHandler {
private final Object delegate;
XAWrapperHandler(Object delegate) {
this
}
//簡單起見
public Object invoke(Object proxy
throws Throwable {
Object result = null;
Connection con = ConnectionManager
try {
//開始一個事務
con
//調用原始業務對象的業務方法
result = method
con
con
} catch (Throwable t) {
//回滾
con
con
throw new SystemException(t);
}
return result;
}
}
}
正如我們所見
public class BookStoreManagerImpl implements BookStoreManager {
public boolean buyBook(String bookId)throws SystemException{
Connection conn=ConnectionManager
boolean b=false;
try{
BookDAO bookDAO=DAOFactory
CustomerDAO customerDAO=DAOFactory
// 嘗試從庫存中取書
if(BookDAO
BigDecimal price=BookDAO
// 從客戶帳戶中扣除price*quantity的費用
b=
CustomerDAO
其他業務方法
}
}catch(SQLException e){
throws new SystemException(e);
}
return b;
}
}
可以看到
public final class ManagerFactory {
//返回一個被包裝的對象
public static BookStoreManager getBookStoreManagerTrans() {
return (BookStoreManager) TransactionWrapper
}
//原始版本
public static BookStoreManager getBookStoreManager() {
return new BookStoreManagerImpl();
}
}
我們在業務代表工廠上提供了兩種不同的對象生成方法
我們的設計還不夠優雅
這篇短文只是介紹下我對事務上下文模式以及聲明式事務管理實現基本原理的理解
[
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27764.html