本文共 5344 字,大约阅读时间需要 17 分钟。
1、用原始的transactionfactorybean的,代理dao事务处理
2、用aop:config声明要进行事务增强的切面,用tx:advice声明具体方法的事务属性,及应用到的事务管理器 3、使用@transactional注解配置声明事务 如有一代表用户的域对象user: package com.domain; import java.io.serializable; public class user implements serializable{ private int user_id; private string user_name; private string user_password; private string user_desc; ....//省略set、get方法 } user的数据库操作接口: package com.dao; import com.domain.user; public interface userdao { public void adduser(user user); } 有一继承spring jdbc支持类的userdao接口实现类,实现添加一个user的方法。它需要注入一个spring jdbc模板类jdbctemplate: package com.dao.jdbc; import com.domain.user; import com.dao.userdao; import org.springframework.jdbc.core.support.jdbcdaosupport; public class userjdbcdao extends jdbcdaosupport implements userdao{ public void adduser(user user){ string sql = "insert into user(user_name,user_password,user_desc) values(?,?,?)"; object[] params = new object[]{ user.getuser_name(), user.getuser_password(), user.getuser_desc() } ; this.getjdbctemplate().update(sql, params); } } 以上dao层的类对应的bean的基本配置文件app_dao.xml如下(数据源的属性放入了外部的资源文件"prop.properties"): <bean class="org.springframework.beans.factory.config.propertyplaceholderconfigurer"> <property name="location" value="classpath:prop.properties"/> </bean> <!--数据源--> <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="${jdbc.driverclassname}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--spring jdbc模板bean,它注入了上面的数据源--> <bean id="jdbctemplate" class="org.springframework.jdbc.core.jdbctemplate"> <property name="datasource" ref="datasource"/> </bean> <!--user数据操作的bean声明,它注入了上面的spring jdbc模板bean:jdbctemplate--> <bean id="userjdbcdao" class="com.dao.jdbc.userjdbcdao"> <property name="jdbctemplate" ref="jdbctemplate"/> </bean> </beans>这里我简单地模拟业务类(业务接口userservice省略):
package com.service.impl; import com.dao.userdao; import com.domain.user; import com.service.userservice; public class userserviceimpl implements userservice { private userdao userdao; public void setuserdao(userdao userdao){ this.userdao = userdao; } public void adduser(user user){ this.userdao.adduser(user); } } 为了在业务类中使用事务管理功能,有如下几个方法: 1、用原始的transactionfactorybean的app.xml基本配置: <import resource="classpath:app_dao.xml"/><!--导入dao层的配置--> <!--spring jdbc的事务管理bean,引入了dbcp数据源--> <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean> <!--业务类bean--> <bean id="userserviceimpltarget" class="com.service.impl.userserviceimpl"> <property name="userdao" ref="userjdbcdao"/> </bean> <!--应用原始的transactionfactorybean进行事务管理bean的声明--> <bean id="userserviceimpl"class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> <property name="transactionmanager" ref="txmanager"/><!--指定事务管理bean--> <property name="target" ref="userserviceimpltarget"/><!--指定业务bean--> <property name="transactionattributes"><!--事务的属性设置列表--> <props> <prop key="add*">propagation_required,isolation_serializable</prop> <!--设置事务为只读时,添加数据将会产生异常--> <!--<prop key="add*">propagation_required,isolation_serializable,readonly</prop>--> </props> </property> </bean> 测试: ...... userserviceimpl usi = (userserviceimpl)ctx.getbean("userserviceimpl"); ...... 2、用tx/aop命名空间配置: <?xml version="1.0" encoding="utf-8"?> <beans ..... xmlns:tx="" xsp:schemalocation=" ........... "> <import resource="classpath:app_dao.xml"/> <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean><bean id="userserviceimpltarget" class="com.service.impl.userserviceimpl">
<property name="userdao" ref="userjdbcdao"/> </bean> <!--应用tx/aop命名空间进行事务声明--> <!--用tx:advice声明具体方法的事务属性,及应用到的事务管理器--> <tx:advice id="txadvice" transaction-manager="txmanager"> <tx:attributes> <tx:method name="add*" read-only="true"/> </tx:attributes> </tx:advice> <!--用aop:config声明要进行事务增强的切面--> <aop:config> <aop:pointcut id="servicemethod" expression="execution(* com.service..add*(..))"/> <aop:advisor pointcut-ref="servicemethod" advice-ref="txadvice"/> </aop:config> </beans> 测试: ....... userservice usi = (userservice)ctx.getbean("userserviceimpltarget"); .......... 3、使用@transactional注解配置声明事务(最简单实用的方法): 在需要事务管理增强的业务类加入@transactional注解标记,如: ...... import org.springframework.transaction.annotation.transactional; //注解式事务 @transactional(readonly=false) //对业务类进行事务增强的标注 public class userserviceimpl implements userservice { ........... } 再在配置文件中用<tx:annotation-driven>驱动自动为标记@transactional注解的类织入事务管理增强: <import resource="classpath:app_dao.xml"/> <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean> <!--注解式事务配置驱动--> <tx:annotation-driven transaction-manager="txmanager" proxy-target-class="true"/> <!--业务类bean的实现类标注了@transactional注解,所以会被 tx:annotation-driven注解驱动自动织入事务增强--> <bean id="userservice" class="com.service.impl.userserviceimpl"> <property name="userdao" ref="userjdbcdao"/> </bean> 测试: ......... userserviceimpl usi = (userserviceimpl)ctx.getbean("userservice");本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/19/1910302.html,如需转载请自行联系原作者