Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制
Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制 201311.27
代码下载 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t
前言:
前一节学习的是Spring中的事务管理的概念,同时通过实践,使用XML配置的方式实现了一个数据库的访问插入数据的事务。
除此之外还有一种比较便捷的方式实现Spring的事务机制:基于Annotation配置的声明式事务。这个内容和之前的Spring中的Annotation方式配置AOP方式差不多。使用这一种方式可以使事务声明和器受影响的业务方法之间更加紧密,既保证了程序开发过程中的思维的连续性,有避免了因为事务定义和业务方法脱离造成的潜在的匹配错误。
1.基于XML配置方式的代码整理
1.1首先是数据库:
创建一个表user,其中有三个字段id, username,password
1.2数据库接口
UserDao.java
package com.yang.dao;
public interface UserDao {
public void add();
}
1.3数据库接口实现类
UserDaoImpl.java
package com.yang.dao.impl;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import com.yang.dao.UserDao;
public class UserDaoImpl implements UserDao {
DataSource dataSource;
public DataSource getDataSource(){
return this.dataSource;
}
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource;
}
@Override
public void add() {
// TODO Auto-generated method stub
JdbcTemplate template = new JdbcTemplate(this.dataSource);
template.execute("insert into user (id, username,password) values ( 3, 'yangtengfei','34567')");
template.execute("insert into user (id, username,password) values ( 4, 'yangtengfei','456789')");
}
}
1.4用户服务的接口
UserService.java
package com.yang.service;
public interface UserService {
public void del();
public void add();
public void update();
public Object select();
}
1.5用户服务接口实现类
UserServiceImpl.java
package com.yang.service.impl;
import com.yang.dao.UserDao;
import com.yang.service.UserService;
public class UserServiceImpl implements UserService {
UserDao userDao = null;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public UserDao getUserDao(){
return this.userDao;
}
@Override
public void del() {
System.out.println("UserServiceImpl.del() function ");
}
@Override
public void add() {
System.out.println("UserServiceImpl.add() function ");
userDao.add();
}
@Override
public void update() {
System.out.println("UserServiceImpl.update() function ");
}
@Override
public Object select() {
System.out.println("UserServiceImpl.select() function ");
return null;
}
}
1.6ApplicationContext配置信息
applicationContext.xml
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
default-lazy-init="true">
<aop:aspectj-autoproxy/>
<!-- 数据源配置信息 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="221256"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="100"/>
<property name="maxIdle" value="30"/>
<property name="maxWait" value="1000"/>
</bean>
<!-- 配置UserService Class -->
<bean id="userDao" class="com.yang.dao.impl.UserDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userService" class="com.yang.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<!-- 事务管理器配置信息 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 事务属性定义 -->
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="add*" rollback-for="Exception"/>
<tx:method name="update*" />
<tx:method name="del*"/>
</tx:attributes>
</tx:advice>
<!-- 通过AOP配置事务增强切面 -->
<aop:config>
<aop:pointcut expression="execution(* com.yang.service.UserService.*(..))" id="allMethods"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods"/>
</aop:config>
</beans>
1.7测试函数
package com.yang.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yang.service.UserService;
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
System.out.println("=======================================");
userService.add();
System.out.println("=======================================");
}
}
一点提示:
对于在配置文件中的每一行都是必须的,尤其是那些不知道什么意思的配置。
2.转换为Annotation配置方式实现
基于Annotation方式定义对象或者方法的事务策略,是在Java源代码级别上声明事物语义的方式。最方便的是修改配置文件中的配置信息。
<tx:annotation-driven transaction-manager="txManager"/>
在配置信息中添加上面的一行配置信息,就可以替换<aop:config>和<tx:advice>的配置信息,通过这个元素,启动容器对于注解型事务管理功能的支持。默认情况之下,会使用id为transactionManager的ref指定transaction-manager属性值,同时还有其他的几个属性:
proxy-target-class: 为true的时候,Spring将会通过创建子类代理业务类;如果是false,则使用基于接口的代理。
order:如果业务类中除了事务切面之外,还需要组织其他的切面,通过该属性控制事务切面的织入顺序。
同时在Java代码中需要添加注解,使用@Transactional注解业务实现类
@Transactional
public class UserDaoImpl implements UserDao{}
对于@Transactional注解的属性有很多的设置:
事务传播行为: propagation
事务隔离属性:isolation
事务只读属性readOnly @Transactional(readOnly=true)
事务超时属性 timeout int
遇到异常是回滚 rollbackFor={SQLException.class,..}
遇到异常不会滚noRollbackFor={}
遇到异常类名回滚rollbackForClassName={“Exception”,}
遇到异常类名不回滚 noRollbackForClassName={“Exception”,}
其中的@Transactional注解可以被应用于接口定义和接口方法、类定义和类的public方法上,Spring建议在业务实现类上使用@Transactional注解。
YangTengfei
2013.11.27
Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制的更多相关文章
- Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理
1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...
- 27Spring_的事务管理_银行转账业务加上事务控制_基于tx.aop进行声明式事务管理
上一篇文章中,银行转账业务没有使用事务,会出现问题,所以这篇文章对上篇文章出现的问题进行修改. 事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) ...
- Spring事务的介绍,以及基于注解@Transactional的声明式事务
前言 事务是一个非常重要的知识点,前面的文章已经有介绍了关于SpringAOP代理的实现过程:事务管理也是AOP的一个重要的功能. 事务的基本介绍 数据库事务特性: 原子性 一致性 隔离性 持久性 事 ...
- Spring -12 -声明式事务及完整的XML配置文件信息 -声明式事务中的相关属性(tx:advice的标签)
1.编程式事务: 1.1由程序员编程事务控制代码. 1.2OpenSessionInView 就属于编程式事务: session.commit()和rollback() 2.声明式事务: 2.1事务控 ...
- Spring学习之Spring中AOP方式切入声明式事务
mybatis-spring官方文档说明 一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到 Spring 的事务管理中.而不是给 MyBatis 创建一个新的 ...
- 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制
新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这 ...
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题(转载)
1.问题复现 spring 3.0 + hibernate 3.2 spring mvc使用注解方式:service使用@service注解 事务使用@Transactional 事务配置使用 < ...
- 【Spring】Spring的事务管理 - 2、声明式事务管理(实现基于XML、Annotation的方式。)
声明式事务管理 文章目录 声明式事务管理 基于XML方式的声明式事务 基于Annotation方式的声明式事务 简单记录 - 简单记录-Java EE企业级应用开发教程(Spring+Spring M ...
- Spring事务:一种编程式事务,三种声明式事务
事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度.TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATIO ...
随机推荐
- HDU - 4675 GCD of Sequence (莫比乌斯反演+组合数学)
题意:给出序列[a1..aN],整数M和k,求对1-M中的每个整数d,构建新的序列[b1...bN],使其满足: 1. \(1 \le bi \le M\) 2. \(gcd(b 1, b 2, -, ...
- [Python]关于return逻辑判断和短路逻辑
定义一个return...and..函数: def res(): ' 返回结果: >>> print(res()) 1234 定义一个return...or..函数: def res ...
- 防止 IOS 和 安卓 自动锁屏
Ios代码 在文件AppController中的 didFinishLaunchingWithOptions函数中加一行代码即可: [[UIApplication sharedApplication] ...
- Python基本数据类型之列表
学习Python的列表类型需要了解和掌握什么是列表.列表的可变性.列表的访问.列表的增删改查等操作~ 1.了解列表 list1 = ['abc', 123, {1, 2, 3},[2,3]] Pyth ...
- C++求矩阵的鞍点
矩阵的鞍点就是指它在本行中的值最大,在本列中的值最小. 求解思路: 求出每行的最大值MaxRow以及每列的最小值MinColumn 保存行最大值的位置和列最小值的位置 如果行最大值得位置和列最小值的相 ...
- 快用Visual Studio(五)- 语言特性
HTML 自带Emment $ SHIFT + OPTION + F:格式化代码 其他语言特性提示 CSS & LESS hover属性,提示样式对象标签 $ CMD + SHIFT + O: ...
- MR案例:输出/输入SequenceFile
SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).在SequenceFile文件中,每一个key-value对被看做是一条记 ...
- [BZOJ2733]永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- Nginx解决post请求405问题
和工商银行的一个合作项目,对方客户端需要请求我们的一个静态页面,但是客户端发送过来的请求方法用的post,日志显示405错误(请求方法错误),正常一个静态页面直接用get请求就可以了,工行那边说写死了 ...
- 跟着vamei复习概率论
最近重新看了一下概率论,感觉很多东西都遗忘了,还会陷入各种误区,赶紧的纠正回来. 概率论这块,主要内容包括: 事件.条件概率.随机变量.随机变量的分布函数.概率密度.联合分布.期望.方差.协方差. 我 ...