使用spring提供的事务处理机制的好处是程序员可以不用关心事务的切面了,只要配置就好了,可以少写代码。

spring声明式事务处理

spring

声明:针对的是程序员,程序员告诉spring容器,哪些方法需要事务,哪些方法不需要事务

事务处理   spring容器来做事务处理

目的:让spring管理事务,开发者不再关注事务

spring声明式事务处理的步骤:

1、搭建环境

2、把dao层和service层的接口和类写完

3、在spring的配置文件中,先导入dataSource

4、测试

5、导入dao和service层的bean

6、测试

7、进行AOP的配置

1、引入事务管理器

2、进行aop的配置

8、测试service层的类看是否是代理对象

例子

Person.java

 package cn.itcast.spring.jdbc.transaction;

 public class Person {
private Long pid;
private String pname;
private String psex;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPsex() {
return psex;
}
public void setPsex(String psex) {
this.psex = psex;
} }

MyPersonDao.java

 package cn.itcast.spring.jdbc.transaction;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class MyPersonDao extends JdbcDaoSupport{
public void savePerson()
{
this.getJdbcTemplate().execute("insert into person(pname,psex) values('bbbbbb','aaaa')");
int i=1/0;
}
}

PersonService.java

 package cn.itcast.spring.jdbc.transaction;

 import cn.itcast.spring.jdbc.PersonDao;

 public class PersonService {
private MyPersonDao dao=new MyPersonDao(); public MyPersonDao getDao() {
return dao;
} public void setDao(MyPersonDao dao) {
this.dao = dao;
} public void savePerson()
{
dao.savePerson(); }
}

MyException.java

 package cn.itcast.spring.jdbc.transaction;

 public class MyException {
public void defineException(Throwable ex){
System.out.println(ex.getMessage());
} }

jdbc.properties

 jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/hibernate_basic
jdbc.username=root
jdbc.password=friends

重点 applicationContext-spring_jdbc_transaction.xml

 <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-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/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean> <bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean> <bean id="personDao" class="cn.itcast.spring.jdbc.transaction.MyPersonDao">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<bean id="serviceDao" class="cn.itcast.spring.jdbc.transaction.PersonService">
<property name="dao">
<ref bean="personDao"/>
</property>
</bean> <bean id="myException" class="cn.itcast.spring.jdbc.transaction.MyException"></bean>
<!-- spring提供的事务管理器, -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!--
通知 1、告诉spring容器,采用什么样的方法处理事务 2、告诉spring容器,目标方法应该采用什么样的事务处理策略
-->
<tx:advice id="tx" transaction-manager="transactionManager">
<tx:attributes>
<!--
save开头的函数名 name规定方法 isolation 默认值为DEFAULT propagation 传播机制 REQUIRED
-->
<tx:method name="save*" read-only="false" />
</tx:attributes>
</tx:advice>
<!-- 本来事务由程序员自己写并且当切面放入,但是这里spring提供了事务处理的通知方法,所以不用程序员写切面了 -->
<aop:config >
<aop:pointcut expression="execution(* cn.itcast.spring.jdbc.transaction.PersonService.*(..))" id="perform"/>
<aop:advisor advice-ref="tx" pointcut-ref="perform" />
<!-- 指定了切面和通知 -->
<aop:aspect ref="myException">
<aop:after-throwing method="defineException" pointcut-ref="perform" throwing="ex"/>
</aop:aspect>
</aop:config>
</beans>

测试

 package cn.itcast.spring.jdbc.transaction;

 import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.spring.jdbc.PersonDao;
import cn.itcast.spring.jdbc.PersonDao2;
import cn.itcast.spring.jdbc.PersonDao3; public class test {
@Test
public void testPersonDao1()
{
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-spring_jdbc_transaction.xml");
PersonService dao=(PersonService) context.getBean("serviceDao");
dao.savePerson();
} }

spring声明式事务以及配置的更多相关文章

  1. Spring声明式事务的配置~~~

    /*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...

  2. 五(一)、spring 声明式事务注解配置

    一.事务概述: 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用:比如 用户购买图书:购买动作之前需要确认 ①图书的数量是否足够:②用户账号余额是否足够 ...

  3. Spring声明式事务的配置方式

    1.事务的特性   原子性:事务中的操作是不可分割的一部分   一致性:要么同时成功,要么同时失败(事务执行前后数据保持一致)   隔离性:并发互不干扰     持久性:事务一旦被提交,它就是一条持久 ...

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

    概述: 接着上一节内容,把注解配置@@Transactional形式改为xml配置形式: 一.配置步骤 1.配置事务管理器 1 <!-- 1配置事务管理器 --> 2 <bean i ...

  5. spring 声明式事务管理

    简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...

  6. XML方式实现Spring声明式事务管理

    1.首先编写一个实体类 public class Dept { private int deptId; private String deptName; public int getDeptId() ...

  7. JavaEE学习之Spring声明式事务

    一.引言 上一篇文章,学习了AOP相关知识,并做了一个简单的Hello world.本文在上篇文章的基础上,进一步学习下Spring的声明式事务. 二.相关概念 1. 事务(Transaction)— ...

  8. Spring声明式事务管理与配置详解

    转载:http://www.cnblogs.com/hellojava/archive/2012/11/21/2780694.html 1.Spring声明式事务配置的五种方式 前段时间对Spring ...

  9. Spring声明式事务(xml配置事务方式)

    Spring声明式事务(xml配置事务方式) >>>>>>>>>>>>>>>>>>>& ...

随机推荐

  1. AGC 018 A - Getting Difference

    题面在这里! 天呐,我已经做了一天水题了mmp 养生最重要,恩. 首先发现最终序列里的元素肯定是 <= max 的,因为无论何时序列里都不会有负数,所以减的话不会变大(反向大只有>2*ma ...

  2. 【动态规划】【记忆化搜索】hdu5965 扫雷

    f(i,j,k)表示第i行,放的雷的状态为j{0表示不放,1表示往上放,2表示往下放,3表示上下都放},剩余还有k(0<=k<=2)个要放的方案数. 先给出我这个sb写的错误代码,死都没调 ...

  3. bzoj 1483: [HNOI2009]梦幻布丁

    1483: [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...

  4. [转]基于全注解的Spring3.1 mvc、myBatis3.1、Mysql的轻量级项目

    摘要 对于现在主流的j2ee企业级开发而言,ssh(struts+hibernate+spring)依然是一个事实的标准.由struts充当的mvc调度控制:hibernate的orm持久化映射:sp ...

  5. MYSQL5上运行多个实例

    date 20131005参考http://chenzehe.iteye.com/blog/1266260官方文档 http://dev.mysql.com/doc/refman/5.1/zh/dat ...

  6. 通过LoadBalancerClient获取所有服务列表的IP

    说明:LoadBalanced采用轮训的方式请求服务提供者,但是如果针对某些业务需要精确到某个服务提供者或者遍历所有的服务提供者,那么可以通过LoadBalancerClient去获得. 参考: ht ...

  7. NHibernate 过滤器(第十五篇)

    NHibernate过滤器相当于定义一个非常类似于类和集合上使用的where子句.ISession 中默认是不启用过滤器的,必须通过ISession.EnableFilter()方法显式的启用. 该方 ...

  8. $("#XXX").click()和$("#YYY").on("click","指定的元素",function(){});的区别(jQuery动态绑定事件)

    //绑定 下一页 的点击事件 $("a[aria-label='Next']").click(function(){ $("a[aria-label='Previous' ...

  9. [Android Pro] 创建快捷方式,删除快捷方式,查询是否存在快捷方式

    1: 创建快捷方式 需要权限: <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORT ...

  10. python修改和获取进程名字:setproctitle

    参考: https://pypi.org/project/setproctitle/