AI智能
改变未来

五(二)、spring 声明式事务xml配置


概述:

接着上一节内容,把注解配置@@Transactional形式改为xml配置形式;

一、配置步骤

1.配置事务管理器

1 <!-- 1配置事务管理器 -->2 <bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">3         <property name=\"dataSource\" ref=\"datasource1\"></property>4 </bean>

2.配置事务属性

1 <!-- 根据方法名,指定事务的属性,若不指定,则方法名用*代替 -->2 <tx:advice id=\"txAdive\" tra56cnsaction-manager=\"transactionManager\">3     <tx:attributes>4         <tx:method name=\"purchase\" propagation=\"REQUIRED\"/>5     </tx:attributes>6 </tx:advice>

3.配置切点

1 <!-- 3配置事务切点 -->2 <aop:config>3     <aop:pointcut expression=\"execution(public void lixiuming.spring.tx.xml.service.*.*(..))\" id=\"txpointcut\" />4     <aop:advisor advice-ref=\"txAdive\" pointcut-ref=\"txpointcut\"/>5 </aop:config>
execution(public void lixiuming.spring.tx.xml.service.*.*(..)) 的说明 ,详见三(二)、AOP配置

附上xml文件:

1 <?xml version=\"1.0\" encoding=\"UTF-8\"?>2 <beans xmlns=\"Java开发/\"3     xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"4     xmlns:context=\"Java开发/\"5     xmlns:tx=\"Java开发/\"6     xmlns:aop=\"Java开发/\"7     xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd9         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd10         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd\">111213 <!-- 配置测试ContactsDao -->14 <!-- <context:component-scan base-package=\"lixiuming.spring.jdbc\"></context:component-scan> -->15 <context:component-scan base-package=\"lixiuming.spring.tx.xml\"></context:component-scan>1617 <!-- 导入资源文件 -->18 <context:property-placeholder location=\"classpath:db.properties\"/>19 <!-- 配置c3p0数据源 -->20 <bean id=\"datasource1\" class=\"com.mchange.v2.c3p0.ComboPooledDataSource\" >21     <property name=\"user\" value=\"${jdbc.user}\"></property>22     <property name=\"password\" value=\"${jdbc.password}\"></property>23     <property name=\"driverClass\" value=\"${jdbc.driverClass}\"></property>24     <property name=\"jdbcUrl\" value=\"${jdbc.jdbcUrl}\"></property>2526     <property name=\"initialPoolSize\" value=\"${jdbc.initPoolSize}\"></property>27     <property name=\"maxPoolSize\" value=\"${jdbc.maxPoolSize}\"></property>28         <property name=\"maxStatements\" value=\"${jdbc.maxStatements}\"></property>29 </bean>303132 <!-- 配置 NamedParameterJdbcTemplate 该对象可以使用具名参数  他没有无参数的构造器,必须指定构造器参数-->33 <bean id=\"namedParameterJdbcTemplate\" class=\"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate\">34     <constructor-arg ref=\"datasource1\"></constructor-arg>35 </bean>3637 <!--配置spring的 jdbcTemplate -->38 <bean id=\"jdbcTemplate\" class=\"org.springframework.jdbc.core.JdbcTemplate\">39     <property name=\"dataSource\" ref=\"datasource1\"></property>40 </bean>41 <!-- 配置bean -->42 <bean id=\"bookShop\" class=\"lixiuming.spring.tx.xml.BookShopImpl\">43     <property name=\"jdbcTemplate\" ref=\"jdbcTemplate\"></property>44 </bean>4546 <bean id=\"bookShopService\" class=\"lixiuming.spring.tx.xml.service.impl.BookShopServiceImpl\">47     <property name=\"dao\" ref=\"bookShop\"></property>48 </bean>4950 <bean id=\"cashier\" class=\"lixiuming.spring.tx.xml.service.impl.CashierImpl\">51     <property name=\"service\" ref=\"bookShopService\"></property>52 </bean>53 <!-- 1配置事务管理器 -->54 <bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">55         <property name=\"dataSource\" ref=\"datasource1\"></property>56 </bean>5758 <!--2 配置事务属性 -->59 <!-- 根据方法名,指定事务的属性,若不指定,则方法名用*代替 -->60 <tx:advice id=\"txAdive\" transaction-manager=\"transactionManager\">61     <tx:attributes>62         <tx:method name=\"purchase\" propagation=\"REQUIRED\"/>63     </tx:attributes>64 </tx:advice>6566 <!-- 3配置事务切点 -->67 <aop:config>68     <aop:pointcut expression=\"execution(public void lixiuming.spring.tx.xml.service.*.*(..))\" id=\"txpointcut\" />69     <aop:advisor advice-ref=\"txAdive\" pointcut-ref=\"txpointcut\"/>70 </aop:config>71727374 </beans>

4.测试方法:

1 package lixiuming.spring.tx.xml;23 import java.util.Arrays;45 import org.junit.Test;6 import org.springframework.context.ApplicationContext;7 import org.springframework.context.support.ClassPathXmlApplicationContext;89 import lixiuming.spring.tx.xml.service.BookShopService;10 import lixiuming.spring.tx.xml.service.Cashier;1112 public class SpringTransactionTest {1314     private ApplicationContext cxt = null;15     private BookShopService parchase = null;16     private Cashier c = null;1718     {19         cxt = new ClassPathXmlApplicationContext(\"applicationcontext22.xml\");20         parchase = (BookShopService) cxt.getBean(\"bookShopService\");21         c = (Cashier) cxt.getBean(\"cashier\");22     }2324     @Test25     public void testCheckout() {26         c.checkout(\"aa\", Arrays.asList(1001, 1001));2728     }2930     @Tead8st31     public void testpurchase() {32         parchase.purchase(\"aa\", 1001);33     }3435 }

测试:

测试前提:用户账户表 账户金额为120 ; 书号1001和1002的图书库存为 10 ;购买第一本书时,账户余额是够的,但是第二本书钱不够;

当第一次运行testCheckout时,报错为余额不足;书号1001和1002的图书库存为 还是为10;用户账户表 账户金额为120 ;

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 五(二)、spring 声明式事务xml配置