`
冰云
  • 浏览: 143856 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

用PicoContainer和Nanning实现事务管理

阅读更多

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中可

分享到:
评论

相关推荐

    PicoContainer源码学习日志

    1. 组件容器:PicoContainer是组件容器的实现,它负责创建和管理对象实例,以及它们之间的依赖关系。通过组件容器,我们可以声明性地定义对象及其依赖,使得代码更易于测试和维护。 2. 容器组件:在PicoContainer中...

    picocontainer:Java微容器

    - **生命周期管理**:Picocontainer可以管理组件的生命周期,包括创建、初始化、使用和销毁等阶段。 - **类型安全**:Picocontainer提供了类型安全的API,确保了注入的对象符合预期类型。 3. **工作原理** ...

    Android代码-picocontainer

    PicoContainer 3.x is in Git at Github and Codehaus (mirrors), and is a work in progress. PicoContainer 3.x is good enough to use in production, but it is not finished yet. Goals over 2.x The major ...

    cucumber-picocontainer-example

    CucumberPicoContainer示例开发环境安装Git( ) 安装JDK 1.5+( 或 ) 安装Maven 3( )下载git clone git@github....jar target/cucumber-picocontainer-example-jar-with-dependencies.jar

    spring好资料哦!强力推荐!!!

    在这种情况下,我们可以利用Spring的IoC来管理不同的组件(如CustomerService、CustomerRepository等),并通过AOP来实现日志记录和事务管理等功能。具体来说: 1. **组件定义**:使用Spring管理CustomerService和...

    图书馆管理系统开题报告 (2).docx

    - **Spring框架的作用**:Spring框架提供了一个全面的应用框架,支持IoC和AOP,简化了Bean装配和事务管理。 2. **轻量级J2EE框架的发展**: - **依赖注入(IoC)**:依赖注入逐渐成为主流的开发方法之一。 - **...

    aopalliance-1.0.jar及aopalliance源码

    1. **事务管理**: AOP Alliance常用于实现事务管理,例如在方法执行前后自动开启和提交/回滚事务。 2. **日志记录**: 通过拦截方法调用来添加日志记录功能,无需在每个业务方法中添加日志代码。 3. **性能监控**: ...

    在Eclipse RCP中实现控制反转(IoC).doc

    在Eclipse RCP环境中,为了实现IoC而不改动其基础结构,可以使用动态字节码操作(如ObjectWeb ASM库)、Java类加载器代理和Java注解技术。这样可以在不影响平台其他部分的情况下,透明地添加IoC框架。 在具体应用中...

    cake-picocontainer-1.3.jar

    jar包,亲测可用

    cake-picocontainer-1.3-sources.jar

    jar包,亲测可用

    coconut-internal-picocontainer-1.3.jar

    jar包,官方版本,自测可用

    Spring ppt

    1. **声明式事务管理**:即使不使用EJB,也可以对POJO进行声明式事务管理。 2. **统一的数据访问处理**:通过通用的异常层次结构简化了与JDBC、Hibernate、JDO等的交互。 3. **灵活的MVC框架**:Spring的Model-View-...

    一种Java快速开发框架的设计和实现.docx

    【标题】:一种Java快速开发框架的设计和实现 在IT领域,尤其是软件开发中,Java快速开发框架( Rapid Application Development,简称RAD)是提高开发效率、简化开发流程的关键工具。本文档将深入探讨一个名为...

    刘树全的J2EE培训教程

    包括了容器(如PicoContainer和xWork)、轻量级框架(Spring)、面向切面编程(AspectJ)、EJB(Enterprise JavaBeans,2.1和3.0版本)、数据库相关技术(JDBC、DAO模式、Spring JDBC、ORM框架如Hibernate、iBatis和...

    Java学习的30个目标

    学习SOAP、REST等Web服务技术,包括JAX-RPC、SAAJ、JAX-WS等API的使用,实现跨平台的数据交换和服务集成。 #### 15. IoC/DI容器与框架 熟悉Spring、PicoContainer等依赖注入(DI)和面向切面编程(AOP)框架,简化...

    DI容器框架Google Guice与Spring框架的区别

    Google Guice和Spring都是流行的Java平台上的DI框架,但它们在实现方式、功能特性和使用场景上有所不同。 **描述解析:** "DI容器,例如spring,picoContainer,EJB容器等等 与Guice的不同" 这里提到了更多的DI...

    成为Java高手的25个学习目标.doc

    15. **J2EE技术**:掌握JNDI(Java命名和目录接口)、JMS(Java消息服务)、JTA/JTS(Java事务API/Java事务服务)、JMX(Java管理扩展)和JavaMail等技术。 通过逐步学习和实践这些目标,你可以逐步提升自己的Java...

    IoC 容器和Dependency Injection 模式

    ### IoC 容器与 Dependency ...通过使用 IoC 容器如 Spring 或 PicoContainer,开发者可以更专注于业务逻辑的实现,而不是管理对象的生命周期。在未来,随着软件架构的不断发展,IoC 和 DI 将继续扮演重要的角色。

    Ioc模式和微容器——j道

    下面介绍两种常用的实现框架:PicoContainer 和 Spring。 ##### PicoContainer PicoContainer 是一个轻量级的Java容器框架,它提供了一种简洁的方式来管理对象及其依赖关系。 **PicoContainer实现代码** ```java...

    学习JAVA的30个目标.doc

    14. **J2EE技术**:熟悉JNDI(Java命名和目录接口)、JTA(Java事务API)、JMS(Java消息服务)等。 以上这些知识构成了Java开发者的坚实基础,随着技术的不断进步,还需要关注新的技术和最佳实践,以便持续提升...

Global site tag (gtag.js) - Google Analytics