分享
 
 
 

用PicoContainer和Nanning实现事务管理

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用PicoContainer和Nanning实现事务管理

Transaction Manager, with PicoContainer and Nanning

作者:冰云

Blog:http://icecloud.51.net

Email:icecloud(AT)sina.com

PicoContainer是constructor injector的IOC容器。Nanning是dynamic AOP的一种实现。项目中我用Pico作为我的微核心,在某些地方需要用到AOP,最典型的是:事务管理(Transaction Manager)。

首先考虑应用的前提,一个DAO需要进行数据库操作并需要事务。下面是两个接口声明:

public interface Dao {

void update();

Object create();

}

public interface TxManager {

void begin();

void commit();

void rollback();

}

如果用OO的实现方法,可能是要让SampleDao这个实现类同时实现两个接口等。按照单一职责原则,SampleDao不应该了解事务管理,或者,某种情况下,不需要事务处理,这时候应该可以关闭事务。

这里引入Aspect(方面)来负责事务处理。或者说,事务其实是Service的一个方面。

但是,一个问题是,事务往往和数据库相关。想要控制事务,必须要能够启动事务的Connection,Session,Transaction等等。必须把这些东西同时传递给Service和TxManager。

public interface ObjectReference{

Object get();

void set(Object obj);

}

public class DatabaseReference implements ObjectReference{

private Connection conn ;

public DatabaseReference(){

// 从某处取得Connection

}

Objcet get(){

return conn;

}

void set(Object obj){

this.conn = (Connection)obj;

}

}

TxManager的实现类可以拥有一个 DatabaseReference的实例用来获取和Connection相关的对象。Service的实例也要得到同一个DatabaseReference,这样TxManager控制同一个Connection的事务才有效果。

示例如下,系统中我是使用的Hibernate的Session

public class TxManagerImpl implements TxManager {

private Connection conn;

public TxManagerImpl(DatabaseReference dref) {

this.conn = (Connection)dref;

}

public void begin() {

conn.setAutoCommit(false);

}

public void commit() {

conn.commit();

}

public void rollback() {

conn.rollback();

}

}

public class SampleDao implements Dao {

Connection conn;

public SampleDao(DatabaseReference dref){

this.conn = (Connection)dref.get();

}

void update() {

conn.executeQuery("...");

}

}

Dao和TxManager之间有了纽带:DatabaseReference。然而,如果要控制事务,还需要一个控制类,将所有的Dao操作置于事务管理内。

public class TransactionAspect implements Aspect {

Pointcut transactionPointcut = P.all();

TxManager txManager;

public TransactionAspect(TxManager transactionManager) {

this.txManager = transactionManager;

}

public void introduce(AspectInstance arg0) {

}

public void advise(AspectInstance instance) {

transactionPointcut.advise(instance, new MethodInterceptor() {

public Object invoke(Invocation invocation) throws Throwable {

txManager.begin();

try {

Object o = invocation.invokeNext();

txManager.commit();

return o;

} catch (Exception e) {

txManager.rollback();

throw e;

}

}

});

}

}

这时就可以建立一个调用的实例了,这就需要PicoContainer来负责对象的创建和管理:

MutablePicoContainer pico = new DefaultPicoContainer(

new CachingComponentAdapterFactory(

new NanningComponentAdapterFactory()));

pico.registerComponentImplementation(TxManager.class,

TxManagerImpl.class);

pico.registerComponentImplementation(TransactionAspect.class,

TransactionAspect.class);

pico.registerComponentImplementation(SampleDao.class);

pico.getComponentInstances();

Dao dao = (Dao) pico.getComponentInstance(SampleDao.class);

dao.update();

上面用到的NanningComponentAdapterFactory,是NanoContainer中nanning包提供,负责将Nanning实例整合到PicoContainer。

从log中可以看到,dao的执行前后分别执行了begin和commit,这样我们就整合了AOP与IOC。

本文需要读者有一定的AOP和IOC知识。本文仅提供示例实现,提供一种思路。欢迎对此有兴趣的人来我blog探讨。

版权声明:

本文由冰云完成,首发于CSDN,作者保留中文版权。

未经许可,不得使用于任何商业用途。

欢迎转载,但请保持文章及版权声明完整。

如需联络请发邮件:icecloud(AT)sina.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有