用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中可
分享到:
相关推荐
1. 组件容器:PicoContainer是组件容器的实现,它负责创建和管理对象实例,以及它们之间的依赖关系。通过组件容器,我们可以声明性地定义对象及其依赖,使得代码更易于测试和维护。 2. 容器组件:在PicoContainer中...
- **生命周期管理**:Picocontainer可以管理组件的生命周期,包括创建、初始化、使用和销毁等阶段。 - **类型安全**:Picocontainer提供了类型安全的API,确保了注入的对象符合预期类型。 3. **工作原理** ...
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 ...
CucumberPicoContainer示例开发环境安装Git( ) 安装JDK 1.5+( 或 ) 安装Maven 3( )下载git clone git@github....jar target/cucumber-picocontainer-example-jar-with-dependencies.jar
在这种情况下,我们可以利用Spring的IoC来管理不同的组件(如CustomerService、CustomerRepository等),并通过AOP来实现日志记录和事务管理等功能。具体来说: 1. **组件定义**:使用Spring管理CustomerService和...
- **Spring框架的作用**:Spring框架提供了一个全面的应用框架,支持IoC和AOP,简化了Bean装配和事务管理。 2. **轻量级J2EE框架的发展**: - **依赖注入(IoC)**:依赖注入逐渐成为主流的开发方法之一。 - **...
1. **事务管理**: AOP Alliance常用于实现事务管理,例如在方法执行前后自动开启和提交/回滚事务。 2. **日志记录**: 通过拦截方法调用来添加日志记录功能,无需在每个业务方法中添加日志代码。 3. **性能监控**: ...
在Eclipse RCP环境中,为了实现IoC而不改动其基础结构,可以使用动态字节码操作(如ObjectWeb ASM库)、Java类加载器代理和Java注解技术。这样可以在不影响平台其他部分的情况下,透明地添加IoC框架。 在具体应用中...
jar包,亲测可用
jar包,亲测可用
jar包,官方版本,自测可用
1. **声明式事务管理**:即使不使用EJB,也可以对POJO进行声明式事务管理。 2. **统一的数据访问处理**:通过通用的异常层次结构简化了与JDBC、Hibernate、JDO等的交互。 3. **灵活的MVC框架**:Spring的Model-View-...
【标题】:一种Java快速开发框架的设计和实现 在IT领域,尤其是软件开发中,Java快速开发框架( Rapid Application Development,简称RAD)是提高开发效率、简化开发流程的关键工具。本文档将深入探讨一个名为...
包括了容器(如PicoContainer和xWork)、轻量级框架(Spring)、面向切面编程(AspectJ)、EJB(Enterprise JavaBeans,2.1和3.0版本)、数据库相关技术(JDBC、DAO模式、Spring JDBC、ORM框架如Hibernate、iBatis和...
学习SOAP、REST等Web服务技术,包括JAX-RPC、SAAJ、JAX-WS等API的使用,实现跨平台的数据交换和服务集成。 #### 15. IoC/DI容器与框架 熟悉Spring、PicoContainer等依赖注入(DI)和面向切面编程(AOP)框架,简化...
Google Guice和Spring都是流行的Java平台上的DI框架,但它们在实现方式、功能特性和使用场景上有所不同。 **描述解析:** "DI容器,例如spring,picoContainer,EJB容器等等 与Guice的不同" 这里提到了更多的DI...
15. **J2EE技术**:掌握JNDI(Java命名和目录接口)、JMS(Java消息服务)、JTA/JTS(Java事务API/Java事务服务)、JMX(Java管理扩展)和JavaMail等技术。 通过逐步学习和实践这些目标,你可以逐步提升自己的Java...
### IoC 容器与 Dependency ...通过使用 IoC 容器如 Spring 或 PicoContainer,开发者可以更专注于业务逻辑的实现,而不是管理对象的生命周期。在未来,随着软件架构的不断发展,IoC 和 DI 将继续扮演重要的角色。
下面介绍两种常用的实现框架:PicoContainer 和 Spring。 ##### PicoContainer PicoContainer 是一个轻量级的Java容器框架,它提供了一种简洁的方式来管理对象及其依赖关系。 **PicoContainer实现代码** ```java...
14. **J2EE技术**:熟悉JNDI(Java命名和目录接口)、JTA(Java事务API)、JMS(Java消息服务)等。 以上这些知识构成了Java开发者的坚实基础,随着技术的不断进步,还需要关注新的技术和最佳实践,以便持续提升...