Spring框架笔记(二十八)—— 使用xml配置文件配置事务

就像前面AOP等部分介绍的,spring在实现AOP时提供了注解和xml配置两种方式。同样,配置事务管理,也可以使用xml文件配置。

这里我们将前面的例子重新复制一份,在tx2包中。

我们把注解全去掉,这里挑一个吧。

package com.happBKs.spring.tx2;

public interface BookShopDao {
	//根据书号获取书的单价
	public int findBookPriceIsdn(String isbn);

	//更新书的库存,使得书号对应的库存-1
	public void updateBookStock(String isbn);

	//更新用户的账户余额:使得相应username记录的balance-price
	public void updateUserAccount(String username,int price);
}
package com.happBKs.spring.tx2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

public class BookShopDaoImpl implements BookShopDao {

	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public int findBookPriceIsdn(String isbn) {
		// TODO Auto-generated method stub
		String sql="select price from book where isbn = ?";
		return jdbcTemplate.queryForObject(sql, Integer.class,isbn);
	}

	public void updateBookStock(String isbn) {
		String sql0="select stock from book_stock where isbn = ?";
		int stock=jdbcTemplate.queryForObject(sql0,Integer.class, isbn);
		if(stock==0)
		{
			throw new RuntimeException("库存不足!");
		}
		// TODO Auto-generated method stub
		String sql="update book_stock set stock = stock-1 where isbn = ?";
		jdbcTemplate.update(sql,isbn);
	}

	public void updateUserAccount(String username, int price) {
		String sql0="select balance from account where username = ?";
		int balance=jdbcTemplate.queryForObject(sql0,Integer.class, username);
		if(balance<price)
		{
			throw new RuntimeException("余额不足!");
		}

		// TODO Auto-generated method stub
		String sql="update account set balance = balance - ? where username = ?";
		jdbcTemplate.update(sql,price,username);
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

	<!-- 自动扫描的包 -->
	<context:component-scan base-package="com.happBKs.spring.jdbcSpring"></context:component-scan>
	<context:component-scan base-package="com.happBKs.spring.tx"></context:component-scan>

	<!-- 导入资源文件 -->
	<context:property-placeholder location="classpath:db.properties" />

	<!-- 配置c3p0数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
	</bean>

	<!-- 配置jdbc模板类 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

<!-- 配置bean -->
	<bean id="bookShopDao" class="com.happBKs.spring.tx2.BookShopDaoImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

	<bean id="bookShopService" class="com.happBKs.spring.tx2.BookShopServiceImpl">
		<property name="bookShopDao" ref="bookShopDao"></property>
	</bean>

	<bean id="cashier" class="com.happBKs.spring.tx2.CashierImpl">
		<property name="bookShopService" ref="bookShopService"></property>
	</bean>

	<!-- 1. 配置事务管理器。以后集成Hibernate、Mybatis需要配置不同的事务管理器 -->
	<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<!-- 2. 配置事务属性。传播行为、隔离级别、只读、超时时间回滚-->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="purchase" propagation="REQUIRED"/>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

	<!-- 2. 配置事务切入点。并把事务切入点与事务属性关联起来。-->
	<aop:config>
		<aop:pointcut expression="execution(* com.happBKs.spring.tx2.BookShopDaoImpl.*(..))" id="txPointCut"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
	</aop:config>
</beans>

测试程序:

package com.happBKs.spring.tx2;

import java.util.Arrays;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TransactionTest {

	private ApplicationContext ctx=null;
	private BookShopDao bookShopDao;
	private BookShopService bookShopService;
	private Cashier cashier=null;

	{
		ctx=new ClassPathXmlApplicationContext("applicationContext_xml.xml");
		bookShopDao=ctx.getBean(BookShopDao.class);
		bookShopService=ctx.getBean(BookShopService.class);
		cashier=ctx.getBean(Cashier.class);
	}

	@Test
	public void test1(){
		System.out.println(bookShopDao.findBookPriceIsdn("1001"));
	}

	@Test
	public void test2(){
		bookShopDao.updateBookStock("1001");
	}

	@Test
	public void test3(){
		bookShopDao.updateUserAccount("HappyBKs", 100);
	}

}
时间: 2024-09-29 19:05:07

Spring框架笔记(二十八)—— 使用xml配置文件配置事务的相关文章

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

马哥学习笔记二十八——nginx反向代理,负载均衡,缓存,URL重写及读写分离

Nginx反向代理 Nginx通过proxy模块实现反向代理功能.在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI.客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server).nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上.如下面的示例中,location的/uri将被替换为上游服务器上的/newuri. location /uri { proxy_pa

angular学习笔记(二十八-附2)-$resource中的promise对象

下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource){ return $resource('/card/user/:userID/:id',{userID:123,id:'@id'},{charge:{method:'POST',params:{charge:true},isArray:false}}) }); HttpREST.factory('h

angular学习笔记(二十八-附1)-$resource中的资源的方法

通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,比如$save,可以直接调用来保存该资源: 比如有一个$resource创建的服务: var service = angular.module('myRecipe.service',['ngResource']); service.factory('Recipe',['$resource',function($resource){ return $resource('/recipe/:id',

Java框架spring学习笔记(十八):事务操作

事务操作创建service和dao类,完成注入关系 service层叫业务逻辑层 dao层单纯对数据库操作层,在dao层不添加业务 假设现在有一个转账的需求,狗蛋有10000元,建国有20000元,狗蛋向建国转账1000元钱. 编写service层创建业务逻辑,OrderService.java 1 import cn.dao.OrderDao; 2 3 public class OrderService { 4 private OrderDao orderDao; 5 6 public voi

使用Spring框架入门二:基于注解+XML配置的IOC/DI的使用

一.简述 本文主要讲使用注解+xml配合使用的几种使用方式.基础课程请看前一节. 二.步骤 1.为Pom.xml中引入依赖:本例中使用的是spring-context包,引入此包时系统会自动导入它的依赖包spring-beans\spring-core\spring-expression\spring-context. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:

[傅里叶变换及其应用学习笔记] 二十八. 高维移位定理

高维傅里叶变换的移位定理 在一维傅里叶变换的移位定理时,有 $f(t) \quad \leftrightarrow \quad F(s)$ $f(t-b) \quad \leftrightarrow \quad e^{-2\pi isb}F(s)$ 在二维傅里叶变换的移位定理时,有两个变量,可分别对它们进行移位, $f(x_1,x_2) \quad \leftrightarrow \quad F(\xi_1,\xi_2)$ $f(x_1-b_1,x_2-b_2) \quad \leftright

Java基础学习笔记二十八 管家婆综合项目

本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添加账务 编辑账务 删除账务 项目环境搭建 技术选型和jar包介绍 每个项目都要使用一些已经成熟的技术,它们通常是由一些专业组织或团队所提供的开源免费技术.在今后的学习过程中,我们会逐渐对这些专业组织有所了解.本项目中使用的技术如下: apache的commons组件: commons-dbutils