在Spring框架中如何应用声明式控制的事务管理技术的应用示例.docx
- 文档编号:11238168
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:15
- 大小:47.32KB
在Spring框架中如何应用声明式控制的事务管理技术的应用示例.docx
《在Spring框架中如何应用声明式控制的事务管理技术的应用示例.docx》由会员分享,可在线阅读,更多相关《在Spring框架中如何应用声明式控制的事务管理技术的应用示例.docx(15页珍藏版)》请在冰豆网上搜索。
在Spring框架中如何应用声明式控制的事务管理技术的应用示例
在Spring框架中如何应用声明式控制的事务管理技术的应用示例
1.1.1采用TransactionTemplate类简化事务编程实现操作
1、TransactionTemplate模板类
TransactionTemplate模板类封装了事务管理的功能,这包括产生数据访问异常时的事务回滚,以及操作成功后的事务提交等。
和Spring框架DAO组件中的JdbcTemplate类一样,它使得开发者无需再关注数据访问中的各种异常出现时的try/catch/finally等代码,这样也将能够帮助开发者省去了部分事务提交、回滚代码。
2、应用TransactionTemplate模板类对前面的DAO类中的doUpdateUserInfo方法进行简化
(1)修改原来的DAOImple类中的doUpdateUserInfo方法为下面的【例9-19】中所示的状态
由于TransactionTemplate模板类需要采用Java中的内部类的编程风格,为了能够在内部类中访问上层类中的成员数据,将原来在updateOneUserInfo方法中定义的一些参数(请参考【例9-17】中的代码示例)移出到类中进行定义。
并请注意其中的黑体部分的代码。
【例9-19】应用TransactionTemplate模板类的代码示例
Objectparameter[]=newObject[3];
StringupdateSQL1=null;
StringupdateSQL2=null;
publicbooleanupdateOneUserInfo(UserInfoVOoneUserInfoVO,StringnewUserPassWord){
StringuserName=oneUserInfoVO.getUserName();
StringuserPassWord=oneUserInfoVO.getUserPassWord();
parameter[0]=newUserPassWord;
parameter[1]=userName;
parameter[2]=userPassWord;
updateSQL1=
"updateuserInfosetuserPassWord=?
whereuserName=?
anduserPassWord=?
";
updateSQL2=
"updateabcTablesetuserPassWord=?
whereuserName=?
anduserPassWord=?
";
TransactionTemplatetransactionTemplate=
newTransactionTemplate(transactionManager);
transactionTemplate.execute(newTransactionCallbackWithoutResult(){
publicvoiddoInTransactionWithoutResult(TransactionStatusstatus){
jdbcTemplate.update(updateSQL1,parameter);
jdbcTemplate.update(updateSQL2,parameter);
}
});
returntrue;
}
(2)对比【例9-19】和【例9-16】中有关事务控制方面的代码
明显地能够发现出,应用TransactionTemplate模板类能够简化对事务控制方面的代码实现。
因为在内部类中的doInTransactionWithoutResult方法中进行的数据访问操作,如果抛出未捕获异常时,Spring框架中的事务控制代码将自动地对数据访问过程进行回滚;当然,如果数据访问成功执行,则将被自动提交。
3、如果应用系统中需要使用基于J2EE应用服务器容器的数据源(JNDI)来实现事务
当应用系统需要应用基于J2EE应用服务器容器的JNDI数据源来实现数据访问,此时的事务控制的具体实现将最终是由应用服务器来承担的。
因此,开发者可以采用下面的【例9-20】中的如下配置项目,使用JtaTransactionManager事务管理器组件。
JtaTransactionManager是PlatformTransactionManager接口带JNDI数据源特性的事务实现类。
请注意其中的黑体部分的标签示例,其中的jdbc/datasource为在J2EE应用服务器容器中所配置定义的数据源名称。
【例9-20】使用JtaTransactionManager事务管理器组件的配置示例
class="org.springframework.jndi.JndiObjectFactoryBean"> class="org.springframework.transaction.jta.JtaTransactionManager"/> Spring框架中JtaTransactionManager组件类默认时是根据JNDI来获取JTA的javax.transaction.UserTransaction对象。 但是,JtaTransactionManager在默认时不能执行事务挂起操作(即它不支持PROPAGATION_REQUIRES_NEW和PROPAGATION_NOT_SUPPORTED等方面的事务属性)。 原因是标准的JTAUserTransaction接口不支持挂起或恢复事务的操作;它只支持开始和完成新事务的操作。 这在下面应用Spring框架中实现声明控制的事务管理时,需要注意该问题。 1.2在Spring框架中实现声明控制的事务管理 1.2.1应用事务代理组件实现Spring中声明控制的事务管理 1、实现Spring框架的声明控制的事务管理 (1)声明控制的事务管理的实现是借助于Spring框架中IoC和AOP技术 Spring框架中所提供的声明控制的事务管理,这是借助于Spring框架中IoC和AOP所提供的功能,同时提供了TransactionInterceptor拦截器组件和常用的代理模式中的代理组件类TransactionProxyFactoryBean,可以直接对组件进行事务代理和实现对事务的控制。 (2)尽量使用声明控制的事务管理 建议在基于Spring框架的应用系统的开发中,尽量使用声明控制的事务管理,以获得数据访问逻辑代码的良好的可移植性。 这也是Spring框架中为开发者全力推荐的事务管理实现方案。 (3)在项目中应该再附加与声明控制的事务管理相关的系统Jar包库 由于Spring框架中的事务管理是依赖于aopalliance.jar与cglib-nodep-2.1_3.jar(它们是SpringAOP中所需要的系统包文件)。 因此,开发者还必须在Web应用系统的lib目录下增加对aopalliance.jar与cglib-nodep-2.1_3.jar的引用。 将它们加入到Web应用系统的lib目录中,请见下面的图9.9中所示的状态。 图9.9添加与声明控制的事务管理相关的系统Jar包库 2、Spring框架的声明控制的事务管理实现的基本原理 Spring框架中进行声明控制的事务管理实现的通常方式是利用AOP(面向切面编程)技术,为普通Java类实现封装事务的访问控制和管理。 当然它是通过Java中的动态代理而实现的,Spring框架可以通过特定的拦截器通知组件来加载事务管理器和对应用系统中的数据访问组件进行监控。 正是由于Spring框架中的声明控制的事务管理实现是基于Java中的动态代理而实现的,而动态代理的一个重要特征是,它是针对接口的。 因此要求应用系统的数据访问组件应该遵守“面向接口”编程实现的要求。 当然如果没有这样的目标接口,那么Spring会使用CGLIB来解决问题,但这不是Spring所推荐的方式(此时应该设置proxyTargetClass属性为true)。 3、TransactionProxyFactoryBean类作为DAO组件的事务代理组件 要进行声明控制的事务管理,一个简化的方法是使用TransactionProxyFactoryBean事务代理组件,通过它可以指定要介入的事务管理对象及其方法。 在应用该事务代理组件的要求如下: TransactionProxyFactoryBean事务代理组件需要一个transactionManager属性;同时还需要target属性,该属性定义需要进行事务代理的类,也就是应用系统的DAO组件类;最后,还需要一个transactionAttributes属性,定义具体的事务要求。 1.2.2在Eclipse中实现声明式的事务管理的实例 Spring框架声明式事务处理中由于主要使用了IoC和AOP的思想和相关的技术实现,同时提供了TransactionInterceptor拦截器和常用的代理类TransactionProxyFactoryBean,从而可以允许开发者直接以配置的方式实现对DAO组件进行事务代理。 请读者注意下面的具体实现过程是在前面的代码方式的过程的基础上进行的。 因此,省略了前面的表示层和控制层的代码的实现过程的说明。 1、添加与SpringAOP技术相关的*.jar包文件到本项目中 开发者还必须在Web应用的lib目录下增加对aopalliance.jar与cglib-nodep-2.1_3.jar的引用。 将它们加入到应用系统的lib目录中,请见下面的图9.10中所示的状态。 图9.10添加与SpringAOP技术相关的*.jar包文件到本项目中 2、在项目的SpringIoC的XML配置文件springapp-servlet.xml中再增加下面的配置 (1)添加transactionManager的配置 【例9-21】在springapp-servlet.xml中增加transactionManager的配置 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> (2)添加一个TransactionProxyFactoryBean的对象声明 并为该组件对象提供各个相关的属性注入对象,其中的proxyInterfaces属性代表被代理的目标DAO组件所在的接口,而transactionManager属性代表在前面的【例9-21】中所定义的DataSourceTransactionManager组件对象实例;target属性代表实际被代理的目标DAO组件对象实例,而transactionAttributes属性则规定对目标DAO组件对象实例中的哪些DAO方法进行事务控制的代理,并规定具体的事务控制的属性。 最后的配置结果请见下面的【例9-22】中的配置项目的状态及示例。 【例9-22】在springapp-servlet.xml中增加TransactionProxyFactoryBean的对象声明 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 在上面的示例中,通过transactionAttributes属性指定了事务的管理策略,其中的updateOneUserInfo*表示指定方法名称以updateOneUserInfo开头的都要纳入事务管理。 当然,开发者也可以指定具体的方法的全名,如果在方法执行过程中发生了错误(抛出异常),则所有操作自动回滚,否则将正常进行提交。 其中在updateOneUserInf*等方法上指定了PROPAGATION_REQUIRED,表示在目前的事务中执行操作,如果事务不存在就建立一个新的,相关的常量的含义都可以在SpringAPI的帮助文档中的TransactionDefinition接口的定义中找到。 而对于DAO组件中的其它方法(通过通配符*所表示的),则进行只读事务管理,以获得更好的数据访问性能(通过只读属性,数据库可以对事务进行优化),因为不会读取未提交的数据,同时它的数据为只读(可提高执行速度),如可以避免对脏数据的检查等。 3、Spring框架的事务属性支持一个称为“回滚规则”的概念 默认情况下,任何RuntimeException或Error类型的异常抛出均会导致回滚。 当然,开发者也可以加上多个事务属性的定义,中间使用逗号“,”来隔离开。 请见【例9-22】示例中的标签,开发者可以加上只读,或者是指定某个异常产生时(并告诉事务代理,在抛出该异常时执行进行回滚),执行回滚操作(请见前面的【例9-3】中的具体配置示例)。 4、本示例完整的配置内容 为了能够让读者真正掌握如何在Spring框架中实现声明式事务,下面给出本示例完整的配置内容的标签项目。 请见下面的【例9-23】中的标签项目示例。 【例9-23】本示例完整的配置标签项目内容 xmlversion="1.0"encoding="UTF-8"? > DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN2.0//EN" "http: //www.springframework.org/dtd/spring-beans-2.0.dtd"> class="org.springframework.jdbc.datasource.DriverManagerDataSource"> jtds: sqlserver: //localhost: 1433/WebStudyDB class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 5、在本项目的业务层组件UserManageImple类中获得daoImpleProxy代理对象 并将它转换为DAOInterface类的对象,在springapp-servlet.xml中进行下面的配置修改。 请见下面的【例9-24】中的状态。 【例9-24】将daoImpleProxy对象动态地注入到业务层组件中的示例 class="com.px1987.springwebapp.model.UserManageImple"> 6、在DAO组件DAOImple类中不需要做任何附加的事务编程实现 【例9-25】应用Spring框架中声明式事务实现的DAO组件的代码示例 packagecom.px1987.springwebapp.dao; importcom.px1987.springwebapp.model.UserInfoVO; importorg.springframework.jdbc.core.*; importjava.util.*; publicclassDAOImpleimplementsDAOInterface{ JdbcTemplatejdbcTemplate=null; publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){ this.jdbcTemplate=jdbcTemplate; } publicDAOImple(){ } publicbooleanupdateOneUserInfo(UserInfoVOoneUserInfoVO, StringnewUserPassWord){ StringuserName=oneUserInfoVO.getUserName(); StringuserPassWord=oneUserInfoVO.getUserPassWord(); Objectparameter[]={newUserPassWord,userName,userPassWord}; StringupdateSQL1= "updateuserInfosetuserPassWord=? whereuserName=? anduserPassWord=? "; StringupdateSQL2= "updateabcTablesetuserPassWord=? whereuserName=? anduserPassWord=? "; this.jdbcTemplate.update(updateSQL1,parameter); this.jdbcTemplate.update(updateSQL2,parameter); returntrue; } } 可以看到,DAO组件DAOImple类中的doUpdateUserInfo方法变得非常简洁,并且在整个代码中没有出现与Spring框架中的事务管理相关的API,这样将能够提高系统的可移植性。 同时,数据访问的逻辑清晰可见,对比【例9-25】和前面代码控制的事务管理的实现【例9-19】和【例9-17】,以及传统的JDBC操作的【例9-1】中的示例,相信读者能够对Spring框架中的声明事务管理的实现有所体验。 7、继续执行本系统中的有关用户信息修改的updateUserInfo.jsp页面 (1)在浏览器中输入下面的URL地址后,将出现下面的图9.11中所示的状态 图9.11对用户信息修改的updateUserInfo.jsp页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring 框架 如何 应用 声明 控制 事务管理 技术 示例