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

上一篇文章中,银行转账业务没有使用事务,会出现问题,所以这篇文章对上篇文章出现的问题进行修改。

事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) 组成 !

项目结构图:

这个案例和前一篇文章的案例是一样的,我们修改的其实只是ApplicationContext.xml文件,其他代码不会变所以这里就不多做解释了。

直接给出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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-2.5.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>   -->
<!-- 引入peoperties文件 -->
<!-- <context:property-placeholder location="classpath:db.properties"/> -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:db.properties"/>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${driver}"/>
  <property name="jdbcUrl" value="${url}"></property>
 <property name="user" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>  

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="AccountDao" class="cn.itcast.dao.AccountDaoimpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean id="AccountService" class="cn.itcast.service.AccountServiceimpl">

</bean>
<!-- 第一步:配置事务管理器 -->
<!-- 事务管理器
之前提过的。事务管理器针对不同的持久层有不同的类,比如Spring自带的SpringJdbc,Hibernata等等。这里用的
就是Sping自带的Jdbc,所以这里用的类是DataSourceTransactionManager
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--
为什么要把dataSource交给transactionManager(事务管理器),
因为事务管理器,需要从数据源获取连接,才能开启事务,提交事务,回滚事务 -->
  <property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步: 配置通知, -->
<!-- 需要通知(Advice),用来对事务增强 。其实advice代表的是环绕前,环绕后要干的事情,
环绕前,环绕后用来干嘛,不就是开启事务,提交事务吗?但是开启事务,提交事务由什么来完成呢?不就是
transactionManager来做。

-->
<tx:advice id="transactionAdvice"  transaction-manager="transactionManager">

<!-- 接下来配事务的配置属性,为什么要配?这样的话,对什么方法,应用怎样的事务配置就知道了。这些配置信息就会成为TransactionDefinition对象
TransactionDefinition里面有什么还记得吗?
之前的论文提过的有四类:1.以ISOLATION开头的 ISOLATION_* :事务隔离级别
                  2.PROPAGATION_* 事务的传播行为等四个。

-->
<tx:attributes>
<!--
name 方法名
isolation 隔离级别
propagation 传播行为
 timeout 超时时间
 read-only 是否只读 (false代表可以更改,true的话代表不能更改)

 rollback-for 配置一些异常类型,发生这些异常 回滚事务。
no-rollback-for 配置一些异常类型,发生这些异常不 回滚事务。
如果没有配置上面两个,默认发生什么异常都要回滚,
-->
  <tx:method name="transfer" isolation="DEFAULT" propagation="REQUIRED"  timeout="-1" read-only="false"/>
</tx:attributes>
</tx:advice>

<!-- 通知都有了接下来第三步就是配置切面了 -->
<aop:config>
    <aop:advisor advice-ref="transactionAdvice" pointcut="execution(* cn.itcast.service.AccountServiceimpl.*(..) )"/>

</aop:config>

</beans>

执行结果:已经有事务的控制了。要不一起成功要不都不成功。

注意!注意!

Spring事务管理Advice,是基于Spring 传统AOP, 所以使用aop :advisor配置

时间: 2024-10-08 23:42:48

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

实现自己的BeanFactory、AOP以及声明式事务

实现自己的BeanFactory                                                                   在使用spring时,我们很少用"new"关键字创建对象,而是通过spring容器BeanFactory提供的getBean()方法得到对象: BeanFactory ctx = new ClassPathXmlApplicationContext(); 通过spring容器统一管理bean的创建,避免了代码中四处散落的&

Spring注解驱动开发(四)-----aop、声明式事务

AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects)-----导入相关jar包 2.MathCalculator-----一个业务逻辑的类-----在业务逻辑运行的时候将日志进行打印(方法之前.方法运行结束.方法出现异常,xxx) package com.atguigu.aop; public class MathCalculator { publ

spring学习笔记(23)基于tx/aop配置切面增强事务

在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来.但它还存在一些缺点: 1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符.返回值.方法入参.异常类型等.如果我们需要为同名不同参的同载方法配置不同事务就会出问题了. 2. 事务属性的配置串虽然能包含较多信息,但配置较易出错. 针对这些问题,我们可以基于Schema,引入tx和aop的命名空间来改进我们的配置: 引入命名空间 <beans xmlns="http://w

28Spring_的事务管理_银行转账业务加上事务控制_基于注解进行声明式事务管理

将applicationContext.xml 和 AccountServiceImpl 给备份一个取名为applicationContext2.xml 和 AccountServiceImpl2.java 第一步:配置事务管理器 第二步:配置注解驱动 以上两步是在ApplicationContext2.xml中完成的. 内容如下所示: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo

AOP:声明式事务管理流程

1. 注册BeanFactoryTransactionAttributeSourceAdvisor @EnableTransactionManagement --> @Import(TransactionManagementConfigurationSelector.class) --> 注册ProxyTransactionManagementConfiguration @Configuration public class ProxyTransactionManagementConfigur

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

新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这个注解是可写可不写的. 这个类会做为字节码的参数传给ApplicationContext @ComponentScan配置要扫描的包 @Import 但是这个Import要导谁呢? 新建JdbcConfig类 这一就可以通过Import导入JdbcConfig这个类 xml里面扫描包的配置可以省略掉

全面分析 Spring 的编程式事务管理及声明式事务管理--转

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

spring事务管理——编程式事务、声明式事务

本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带有 512MB 内存(

分析 Spring 的编程式事务管理及声明式事务管理(转)

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带