spring第9天(事务)
依赖:spring-context,spring-jdbc(这个本身有依赖spring-tx,关于事务的),druid,mysql-connector-java,aspectjweaver五个
由于我是在dao层的实现类中直接使用JdbcTemplate属性进行一些简单的测试,所以
配置文件:仍然是先写一个DruidDataSource的bean,
在JdbcTemplate的bean下,添加DruidDataSource的引用,然后配置dao和service。
事务配置:
1.DataSourceTrancetionManager(全称org.springframework.jdbc.datasource.DataSourceTransactionManager)的<bean>,配置dataSource属性。
关于这个bean的id有一个注意的地方,下面2中的transaction-manager的默认值为"transactionManager",因此如果该bean的id为这个,下面2中的属性可以不
写,默认值就是,会直接找的。
2.<tx:advice>,它导入的xmlns是以tx结尾的,别弄错了。例子:
<tx:advice id="txAdvisor" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" propagation="REQUIRED" rollback-for="com.dao.MyCheckEx"/>
</tx:attributes>
</tx:advice>
<!--
tx:advice的事务管理器设置:
如果你配置的事务管理器的名字就叫做transactionManager,
那么transaction-manager就可以不用设置
可以配置多个method,一般的配置,查询操作用只读事务,会优化性能
它也支持通配符* 默认情况下,spring会对运行时异常产生回滚,检查异常不回滚
如果想针对检查异常也回滚,那么就需要配置rollback-for mybatis这种持久层框架,其所有数据库操作的异常都是运行时异常
所以method的rollback-for保留默认即可,不需要额外配置 事务传播:transaction propogation:主要指的是先前的事务信息
-->
最后关于<aop>的配置,今天练习的时候出了一个坑,自己半天没发现,我在<aop:pointcut>中配置表达式,测试回滚的时候一直失败。怀疑是rollback-for的配置有问题,改了半天代码,最后突然想起来会不会是表达式写错了,一检查才发现指向的不是进行回滚测试方法的那个类——删除员工表数据和删除部门表数据,先删员工后删部门,这两个删除方法是另外写一个类的方法中调用的,本来表达式应该指向这个类的这个方法,但是我指向了单独的删除部门的方法。
另外今天有用到parent这个属性,忘记怎么写了——在要继承别的<bean>的bean上写上parent属性,关于这个父类bean,它如果是抽象类之类的,就不要写class了,并且加上abstract=“true”防止getBean。
今天还有一个错误,如果aop表达式写错,找不到目标的话,会报一个错,忘记记录了,总的来说就是总是说你的第一个<bean>找不到。
spring和mybatis的事务整合直接上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:context="http://www.springframework.org/schema/context"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <context:property-placeholder location="classpath:db.properties" local-override="true"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${mysql.username}"></property>
<property name="password" value="${mysql.password}"></property>
<property name="url" value="${mysql.url}"></property>
</bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath*:*Mapper.xml"></property>
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"></property>
</bean>
</property>
<property name="plugins">
<list>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<prop key="supportMethodsArguments">true</prop>
</props>
</property>
</bean>
</list>
</property>
</bean> <mybatis:scan base-package="com.zyl.paging.dao"></mybatis:scan> <bean id="deptServiceImpl" class="com.zyl.paging.service.impl.DeptServiceImpl" autowire="byType"></bean>
<bean id="deptBackupServiceImpl" class="com.zyl.paging.service.impl.DeptBackupServiceImpl" autowire="byType"></bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <tx:advice id="txAdvisor">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com..service.impl.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvisor" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
</beans>
复习的时候对web.xml中的3个配置产生了疑惑:
1.classpath和classpath*的区别:
classpath:只会到你指定的class路径中查找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.
2.配置的<context-param>中<param-name>contextConfigLocation</param-name>中的值是不是不能改:不能改
3.<listener>有什么用?注释后,在java代码getBean处会发生错误,ContextLoaderLitener实现了ServletContextListner,在servlet加载和销毁的时候会自动调用相应的方法。
4.<filter>中的<init-param>的<param-name>的值是不是不能改:不能。进入CharacterEncodingFilter类中,会找到相应的字段和set方法。过滤器中的两个<init-param>缺一不可,不然会中文字符变成?
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param> <init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
spring第9天(事务)的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- spring aop 声明式事务管理
一.声明式事务管理的概括 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一. Spring的声明式事务顾名思义就是采用声明 ...
- Spring 中的 JDBC 事务
Spring 对 JDBC 的支持 JdbcTemplate 简介 •为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. • ...
- Spring中的Jdbc事务管理
Spring提供了对事务的声明式事务管理,只需要在配置文件中做一些配置,即可把操作纳入到事务管理当中,解除了和代码的耦合. Spring声明式事务管理,核心实现就是基于Aop. Spring声明式事务 ...
- Spring的声明试事务
1 在配置文件中加入: <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.spring ...
- spring的annotation-driven配置事务管理器详解
http://blog.sina.com.cn/s/blog_8f61307b0100ynfb.html ——————————————————————————————————————————————— ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- Spring使用注解进行事务的管理
使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/ ...
- Spring之声明式事务
在讲声明式事务之前,先回顾一下基本的编程式事务 编程式事务: //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); try { ...
随机推荐
- KDE Plasma 5.17 即将发布
导读 Plasma 5.17上个月达到了beta版本,而下周将发布Plasma 5.17.0版本!KDE桌面的大更新只有几天了.因此,开发人员一直在整理它,同时也集思广益讨论Plasma 5.18应该 ...
- 微信二次分享的JSSDK的调用
网页端微信的二次分享如果不调用分享的SDK,分享之后就不会带有标题.描述 .缩略图 微信分享SDK调用 引入 <script src="//res.wx.qq.com/open/js/ ...
- 无法通过128在表空间temp中扩展temp字段
truncate 表后在执行,这个原因是数据太大了
- RabbitMq学习笔记——概念
1.RabbitMQ简介 MQ全称为Message Queue(消息队列),是一种“应用程序”<—>“应用程序”的通信方法.MQ是一个典型的“消费”<—>“生产者”模型的代表, ...
- (5)LoraWAN:Join procedure、Receive Windows
网络在建立之初,终端设备启动后需要向服务端发起Jion请求(接入请求),只有在接入请求得到成功答复,并根据答复配置相关参数后,终端才算成功加入网络.Jion成功后才能进行数据的上行.下行通信. Jio ...
- maven构建项目失败----99%
删除工作空间信息,重新导入,问题解决, 该问题,可能是安装Spring IDE 导致的问题,eclipse兼容性问题
- Day2-C-迷宫问题 -POJ3984
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- 106、Java中String类之使用contains()方法判断子字符串是否存在
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 关于python中format占位符中的 {!} 参数
在看celery的时候,发现里面有这么一句 print('Request: {0!r}'.format(self.request)) 关于里面的{0!r}是什么意思翻了一下文档. 文档里是这么描述的 ...
- Activemq、Rabbitmq、Rocketmq、Kafka的对比
综上所述,各种对比之后,我个人倾向于是: 一般的业务系统要引入MQ,最早大家都用ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人 ...