您的位置:首页>软件开发>软件架构>

如何在Spring中实现事务暂停系列之一

[ 来源:Matrix | 更新日期:2007-7-15 20:16:22 | 评论 0 条 | 我要投稿 ]

Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的。Spring的声明性事务分离可以应用到任何POJO目标对象,并且包含所有EJB基于容器管理事务中的已声明事务。后台的事务管理器支持简单的基于JDBC的事务和全功能的基于JTA的J2EE事务。

这篇文章详细的讨论了Spring的事务管理特性。重点是如何在使用JTA作为后台事务策略的基础上让POJO利用Spring的声明性事务,这也显示了Spring的事务服务可以无缝地与J2EE服务器(如BEA WebLogic Server的事务协调器)的事务协调器进行交互,作为EJB CMT传统事务分离方式的一个替代者。

POJO的声明性事务

作为Spring声明性事务分离方式的样例,让我们来看一下Spring的样例应用PetClinic的中心服务外观中的配置:

清单1:


class="org.springframework.
jndi.JndiObjectFactoryBean">
java:comp/env/jdbc/petclinic

字串5


id="transactionManager"
class="org.springframework.transaction.
jta.JtaTransactionManager"/>id="clinicTarget"
class="org.springframework.
samples.petclinic.jdbc.JdbcClinic">


class="org.springframework.transaction.
interceptor.TransactionProxyFactoryBean">









PROPAGATION_REQUIRED,readOnly
字串1

PROPAGATION_REQUIRED






他遵循Spring的标准XMLBean定义格式。定义了:

1、一个DataSource引用,指向一个JNDI位置―在J2EE服务器管理下这将从JNDI环境中获取特定的DataSource。

2、一个应用服务实现―这是一个POJO,封装了业务和数据访问逻辑。在这里实现了应用中的Clinic服务接口。

3、一个应用服务的事务代理―这个代理为目标服务定义了事务属性,匹配特定的方法名模式并为之创建相应的事务。在实际的事务管理中,代理指向一个PlatformTransactionManager实现。

注意:除了显式的代理定义,Spring还支持自动代理机制和通过Commons Attributes或J2SE 5.0注解实现源程序级的元数据使用。这些可选方法的讨论超过了本文的范围。可以参考Spring的文档来了解相关细节。

业务接口和业务实现是特定于应用的并且不需要关心Spring或者Spring的事务管理。普通Java对象可以作为服务的目标对象,而且任何普通Java接口可以作为服务的接口。下面是一个Clinic接口的示例:
字串7


清单2:


public interface Clinic
{
Pet loadPet(int id);
void storePet(Pet pet);
...
}


这个接口的实现如下显示,假设他使用JDBC来执行必要的数据访问。他通过bean属性的设置方法来获取JDBC的DataSource;这与上面的配置中的dataSource属性定义相对应。

清单3:


public class JdbcClinic implements Clinic
{
private DataSource dataSource;
public void setDataSource
(DataSource dataSource)
{
this.dataSource = dataSource;
}
public Pet loadPet(int id)
{
try
{
字串7

Connection con =
this.dataSource.getConnection();
...
}
catch (SQLException ex)
{
...
}
}
public void storePet(Pet pet)
{
try
{
Connection con =
this.dataSource.getConnection();
...
}
catch (SQLException ex)
{
...
}
}
...
}


如你所见,代码相当直接。我们使用一个简单的Java对象,而事务管理由事务代理来处理,这个我们会在后续的连载文章中做出讨论。

注意在PetClinic示例应用中实际的基于JDBC的Clinic实现利用了Spring的JDBC支持类来避免直接使用JDBC的API。虽然Spring的事务管理也可以与普通的基于JDBC实现一起工作,就向上面的示例。 字串5


Tags:
责任编辑:
您的评论
用户名: 新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为