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&amp;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方式的声明式事务管理机制的更多相关文章

  1. Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

    1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  2. 27Spring_的事务管理_银行转账业务加上事务控制_基于tx.aop进行声明式事务管理

    上一篇文章中,银行转账业务没有使用事务,会出现问题,所以这篇文章对上篇文章出现的问题进行修改. 事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) ...

  3. Spring事务的介绍,以及基于注解@Transactional的声明式事务

    前言 事务是一个非常重要的知识点,前面的文章已经有介绍了关于SpringAOP代理的实现过程:事务管理也是AOP的一个重要的功能. 事务的基本介绍 数据库事务特性: 原子性 一致性 隔离性 持久性 事 ...

  4. Spring -12 -声明式事务及完整的XML配置文件信息 -声明式事务中的相关属性(tx:advice的标签)

    1.编程式事务: 1.1由程序员编程事务控制代码. 1.2OpenSessionInView 就属于编程式事务: session.commit()和rollback() 2.声明式事务: 2.1事务控 ...

  5. Spring学习之Spring中AOP方式切入声明式事务

    mybatis-spring官方文档说明 一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到 Spring 的事务管理中.而不是给 MyBatis 创建一个新的 ...

  6. 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

    新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这 ...

  7. 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题(转载)

    1.问题复现 spring 3.0 + hibernate 3.2 spring mvc使用注解方式:service使用@service注解 事务使用@Transactional 事务配置使用 < ...

  8. 【Spring】Spring的事务管理 - 2、声明式事务管理(实现基于XML、Annotation的方式。)

    声明式事务管理 文章目录 声明式事务管理 基于XML方式的声明式事务 基于Annotation方式的声明式事务 简单记录 - 简单记录-Java EE企业级应用开发教程(Spring+Spring M ...

  9. Spring事务:一种编程式事务,三种声明式事务

    事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度.TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATIO ...

随机推荐

  1. servlet中通过getWriter()获取out返回给浏览器出现中文乱码问题

    感谢博主https://blog.csdn.net/louyongfeng3613/article/details/50160317 在Servlet编程中,经常需要通过response对象将一些信息 ...

  2. iOS & Android APP crash保护机制

    一.背景 还在码代码,码好再BB... 二.思路 三.解决方案 四.注意点 五.开源项目 github:https://github.com/qiyer/QYCrashProtector

  3. C++ 第三十四天

    c++ 已经搁了很久了,之所以捡起来是因为学校数据结构课程设置 **.我对 c++ 的掌握非常不扎实,因为除了顺序阅读 c++ primer 外就没有什么实践, 但是我又无法忍受自己写出来的 * 一样 ...

  4. 为什么 PHP 程序员应该学习使用 Swoole

    最近两个月一直在研究 Swoole,研究成果即将在6.21正式开源发布,这段时间没有来水文章,趁着今天放假来水水吧. 借助这篇文章,我希望能够把 Swoole 安利给更多人.虽然 Swoole 可能目 ...

  5. 20145301 《Java程序设计》第八周学习总结

    20145301 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章部分 - 通用API 日志API 日志: 日志对信息安全意义重大,审计.取证.入侵检测等都会用到日志信息 L ...

  6. JAVA基本常识及环境搭建

    JAVA基本常识及环境搭建 常用dos命令行 dir 列出当前目录下的文件以及文件夹 md 创建目录 cd 进入指定目录 cd.. 退回到上一级目录 cd/ 退回到根目录 del 删除文件 删除单个文 ...

  7. 20145324 《Java程序设计》第8周学习总结

    20145324 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 1.NIO使用频道来衔接数据节点,可以设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行标记,提供clear ...

  8. nodeJs和JavaScript的异同

    JavaScript组成:ECMAScript(定义这门语言的基础,比如语法.数据类型.结构以及一些内置对象等).DOM(基于ECMASCRIPT,扩展出来的用于操作页面元素的方法).BOM(基于EC ...

  9. ubuntu安装python MySQLdb模块

    本文讲述了python安装mysql-python的方法.分享给大家供大家参考,具体如下: ubuntu 系统下进行的操作 首先安装了pip工具 ? 1 sudo apt-get install py ...

  10. go-ipfs入门及介绍

    1.go-ipfs安装 参考: https://mp.weixin.qq.com/s?__biz=MzUwOTE3NjY3Mw==&mid=2247483734&idx=1&s ...