用PicoContainer和Nanning实现事务管理

原创 2004年02月25日 10:31:00

PicoContainerNanning实现事务管理

Transaction Manager, with PicoContainer and Nanning

作者:冰云
Bloghttp://icecloud.51.net
Emailicecloud(AT)sina.com

PicoContainerconstructor injectorIOC容器。Nanningdynamic 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,SessionTransaction等等。必须把这些东西同时传递给ServiceTxManager

 

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的事务才有效果。

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

 

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("...");

    }

}

 

DaoTxManager之间有了纽带: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,是NanoContainernanning包提供,负责将Nanning实例整合到PicoContainer

log中可以看到,dao的执行前后分别执行了begincommit,这样我们就整合了AOPIOC

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

 

版权声明:

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

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

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

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

 

 

用PicoContainer和Nanning实现事务管理

用PicoContainer和Nanning实现事务管理Transaction Manager, with PicoContainer and Nanning作者:冰云Blog:http://ic...
  • techcrunch
  • techcrunch
  • 2008年04月09日 00:34
  • 151

动态代理和nanning AOP-3

动态代理和nanning AOP-3                                     用nanning来实现Interception关键字:  AOP  Nanning   D...
  • accesine960
  • accesine960
  • 2004年04月28日 22:46
  • 2023

ACM/ICPC 2017 Nanning Regional 总结

这是我的第一赛季的最后一场比赛,本来很不愿意写这个总结,但是想了想还是写吧。先来说说比赛和南宁,这次去南宁就耗费了大量的时间在火车上,虽然到了第二天才开始热身赛,长途的奔波的确让我们几个感到身心疲惫。...
  • lingzidong
  • lingzidong
  • 2017年11月30日 21:25
  • 75

Spring事务管理及几种简单的实现

事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,最为典型的就是银行转账的案例:A要向B转账,现在A,B各自账户中有1000元,A要给B转200元,那么这个转账就必须保证是一个事务,防止中途...
  • zhuxinquan61
  • zhuxinquan61
  • 2017年05月01日 22:30
  • 2855

动态代理和nanning AOP-2 实现Introduction

动态代理和nanning AOP-2                                     用nanning来实现Introduction 关键字:  AOP  Nanning   ...
  • accesine960
  • accesine960
  • 2004年04月28日 22:46
  • 2193

PicoContainer基础介绍

基础 这是一篇PicoContainer最重要特性的快速介绍。读完你能对PicoContainer是什么和不是什么有一个概念。 PicoContainer最重要的特性是实例化任意对象。这些通过它的...
  • aqzwss
  • aqzwss
  • 2017年01月13日 22:35
  • 285

PicoContainer

1.   PicoContainer介绍 1.1. 简介 PicoContainer是codehaus开源组织的一个子项目。它是一个轻量级的DI(Dependency Injection)组件...
  • yuxiayiji
  • yuxiayiji
  • 2012年04月17日 09:41
  • 2156

JDBC 实现 事务管理

为了实现数据库数据的安全性,数据库有了事务管理机制。 事务管理具有 原子性 —— 具有相互关联的一系列操作,要么一次全部执行成功,要么执行失败,数据回滚; 一致性 —— 数据库在事务执行前后,数据库都...
  • u013630349
  • u013630349
  • 2016年08月02日 11:44
  • 392

Java事务管理之Spring+Hibernate

环境与版本除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate还需要加入Spring的lib 包和如下的一些依赖包org.aopallianceorg.aspectj...
  • oscar999
  • oscar999
  • 2017年02月16日 17:32
  • 1093

利用spring的aop实现事务管理步骤

在spring-context.xml中配置即可(这只贴了关键信息):                 注意:在定位参数的时候,com.wb.service.impl...
  • Mos_wen
  • Mos_wen
  • 2016年03月01日 19:20
  • 6581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用PicoContainer和Nanning实现事务管理
举报原因:
原因补充:

(最多只允许输入30个字)