




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
未来蓝图软件教育 Spring拦截器中的事务管理阶段目标:1、掌握什么是spring的数据库操作和事务管理2、spring数据库操作的实现步骤3、spring对数据库操作的事务管理4、spring的事务管理与Aop的关系4、总结spring事务管理的几种实现方式、区别及优劣5、熟练在ssh项目中使用spring的数据操作和事务管理本章课时:3课时一、关于Spring拦截器中的数据库操作和事务管理Spring中的事务管理是通过AOP代理来实现的,对被代理对象的每个方法进行拦截,在方法执行前启动事务,方法执行完后根据是否有异常和异常的种类进行提交或回滚。 如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信息,这些操作通过调用一个服务类的方法来执行,这个方法也在spring事务管理拦截器的管理之下,那么这个记录方法需要在另一个事务中进行,而不是与被拦截方法在同一个事务中,不然如果被拦截方法抛出异常需要回滚时,所作的记录也会被回滚,当然有时候确实需要同时回滚,那就要放在同一个事务中。 这和自己的拦截器和事务管理的拦截器的执行顺序有一定关系,spring事务管理拦截器是一个环绕通知,在被拦截方法执行前启动事务,执行后完成事务,如果自己的拦截器被spring事务管理拦截器包围在里面,那么在自己的拦截器运行时,spring已经启动了一个事务,如果你的记录信息方法需要与被拦截方法同在一个事务中,将你的记录信息方法的事务传播属性设为默认的REQUIRED就可以了。如果你记录信息的方法需要单独的一个事务环境,那就要把事务传播属性设为REQUIRES_NEW了,这样spring事务管理器会新建一个事务,并且新建一个session连接,因为一个数据库连接不可能同时有两个事务,记录信息完了提交事务并且把新建的session连接关闭,自己的拦截器退出后继续执行被拦截的方法或它的事务处理。 相反如果自己的拦截器在spring事务管理拦截器的外面,那么记录信息的方法会在一个单独的事务中执行,并提交,不管它的事务传播属性是REQUIRES_NEW还是REQUIRED,因为与被拦截方法的事务处理没有交叉,并且可以使用同一个session连接如果是OpenSessionInViewFilter。 所以如果记录信息和被拦截方法要在不同事务中执行,分别提交,那么最好将自己的拦截器设在spring事务管理器拦截器的外面;如果需要将记录信息和被拦截方法在同一个事务中处理,必须将自己的拦截器被包围在spring事务管理拦截器中,并且记录信息方法的事务传播属性为默认的REQUIRED。 设置拦截器的执行顺序可以让拦截器处理类实现org.springframework.core.Ordered接口,在spring配置文件的AOP设置中设定自己的拦截器和spring事务管理拦截器的执行顺序,将自己的拦截的序号排在spring事务管理的前面,就可以将该拦截器放到事务管理拦截器的外面执行了,对于before通知方式会先于事务管理拦截器执行,对于after returning和after和after throwing通知方式会后于事务管理拦截器的执行,对于around通知方式会包围事务管理拦截器执行。 二、Spring事务管理 Spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。(一)、声明式事务管理通常建议采用声明式事务管理。声明式事务管理的优势非常明显:代码中无需关于关注事务逻辑,让Spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换。声明式事务管理的配置方式,通常有如下三种:1、使用TransactionProxyFactoryBean创建事务代理(通常事务代理以Service层为目标bean)(1)、第一种使用方式:使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。此方式是最传统,配置文件最臃肿、难以阅读的方式。/配置hibernate的事务管理器,使用springz中的HibernateTransactionManager类,该类实现了PlatformTransactionManager接口,针对hibernate 持久化连接的特定实现 /Dao /使用TransactionProxyFactoryBean创建事务代理(通常事务代理以Service层为目标bean) /配置xtyhbService bean的事务代理 PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly (2)、第二种使用方式: 使用TransactionProxyFactoryBean为目标bean生成事务代理的配置,采用bean配置继承的事务代理配置方式,比较简洁,但依然是增量式配置。/配置hibernate的事务管理器,使用HibernateTransactionManager类,该类实现了PlatformTransactionManager接口,针对hibernate 持久化连接的特定实现 /需要生成代理的目标bean /配置抽象的基础代理 PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly /通过bean配置的继承来声明xtyhbService bean的事务代理 2.使用自动创建代理简化事务配置 使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。使用BeanNameAutoProxyCreator 和DefaultAdvisorAutoProxyCreator创建代理时,并不一定是创建事务代理,关键在于传入的拦截器,如果传入事务拦截器,将可自动生成事务代理。如果传入日志拦截器,将可自动生成日志代理。/配置事务拦截器bean/事务拦截器需要注入一个事务管理器 /定义事务传播属性 PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly /给在列表中定义的需要代理的Bean的创建代理器BeanNameAutoProxyCreator(Auto proxy creator that identifies beans to proxy via a list of names) xtyhbServicei /此处可以增加其他需要创建事务代理的bean transactionInterceptor /此处可以增加其他新的Interceptor /配置事务代理目标bean xtyhbServicei,该目标bean在生成对象后,自动生成代理 3. Spring封装AspectJ的方式来声明事务配置/事务管理器 三、Spring事务管理应用案例1、Spring封装AspectJ的方式来声明事务的应用案例下面以一个常用的异常拦截器的例子来说明事务应用:一个用户登录的功能,Spring对service中的每个方法进行事务管理,在检测用户是否存在的service方法上同时加一个异常拦截器,当用户不存在或密码不正确时该方法会抛出异常,异常拦截器捕获到该异常,同时记录一些日志。 Spring配置文件相关: 拦截器类:import org.aspectj.lang.ProceedingJoinPoint;import org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint;import org.springframework.core.Ordered;import org.wllt.www.service.LoginfoService;public class EventLogInterceptor private LoginfoService service; public Object serviceIntercept(ProceedingJoinPoint point) throws Throwable if(point instanceof MethodInvocationProceedingJoinPoint) MethodInvocationProceedingJoinPoint mpoint = (MethodInvocationProceedingJoinPoint)point; / try System.out.println(记录日志开始); service.saveLoginfo(xtyhb); System.out.println(记录日志结束); catch(Exception ex) ex.printStackTrace(); return null; public LoginfoService getService() return service;public void setService(LoginfoService service) this.service = service; 配置分析: 1、第一种配置情况配置如下:service方法中的事务传播属性都设为要求新建事务(REQUIRES_NEW),用户登录校验事务管理切面拦截器的order设为1,而log拦截器的事务order设为2,这意味着这两个要同时执行时,先执行用户登录校验事务拦截器,后执行log拦截器,由于事务管理是一个环绕通知(around),实际上是log拦截器被包围在帐号检验的事务管理拦截器中。结果如下:从结果中可以看出,log异常拦截器在用户登录校验的事务回滚之前截获异常,在记录日志时,日志记录的service方法也在用户登录校验的事务管理之下,用户登录的事务还没有结束,根据REQUIRES_NEW特性,spring会新开一个事务,这时原来的数据库连接已经在一个事务中,一个连接不可能同时有两个事务,所以同时新创建一个session连接,日志记录就在新建的事务和session中进行,完了提交,并且会把新建的session连接关闭。 然后继续进行被中断的用户登录的事务管理操作,由于抛异常spring将用户登录的事务回滚。 这样能够实现预想的功能,但是如果我去掉指定的REQUIRES_NEW,那么log记录的操作会继续在用户登录的事务中进行,最后会被一起回滚。2、第二种配置情况配置如下: 如果我把用户登录校验事务管理的order设为2,log拦截器的order设为1,也就是log拦截器在事务管理拦截器的外面,会在log的save事务管理拦截器执行完了再执行check的异常事务管理结果如下: 可以看出,用户登录的事务和日志记录的事务是前后两个不相关的事务,并且在日志记录事务中并不需要新建session连接。实际上这时也并不需要将propagation设为REQUIRES_NEW,使用默认的REQUIRED也照样能够正常工作。 所以应该将该异常拦截器设在事务管理拦截器的外面,即log拦截器的order设为1,使异常拦截器引起的log事务排在前面。 Transaction advice(环绕通知)事务切面 logAspect(Exception)Check用户检验方法XtyhbServiceTransaction adviceSaveLoginfoServiceEventLogInterceptor Intercept事务切面抛出Exceptionaop:aspectactionn save Check 异常出现 事务开始 回滚专业名词解释1、orderControls the ordering of the execution of this aspect when multipleadvice executes at a specific joinpoint.2、propagation(如果不出现默认的是propagation=” REQUIRES”) REQUIRES表示传播事务 REQUIRES_NEW表示创建新的事务3、环绕通知arroundbeginTransactiontry
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒楼行政总厨聘用协议5篇
- 商场复工复产安全培训课件
- 国家事业单位招聘2025中国人民大学书院建设与管理中心招聘1人笔试历年参考题库附带答案详解
- 南部县2025上半年四川南充市南部县事业单位考调10人笔试历年参考题库附带答案详解
- 北海市2025广西互联网舆情中心招(实名编制)8人(截止5月27日)笔试历年参考题库附带答案详解
- 包河区2025年合肥包河区事业单位招聘劳务派遣人员29名笔试历年参考题库附带答案详解
- 云南省2025云南省教育后勤协会招聘1人笔试历年参考题库附带答案详解
- 上海市2025上海申康医疗卫生建设工程公共服务中心工作人员招聘1人笔试历年参考题库附带答案详解
- 2025重庆紫光国际化工有限责任公司招聘16人笔试参考题库附带答案详解
- 2025贵州茅台酒股份有限公司招聘158人笔试参考题库附带答案详解
- 2025年大学生英语六级必考词汇表全部汇编(带音标)
- 土木工程生产实习日记50篇
- GB/T 5993-2003电子设备用固定电容器第4部分:分规范固体和非固体电解质铝电容器
- FZ/T 52059-2021抗菌粘胶短纤维
- 医学课件-护理评估课件
- 幼儿园大班安全教育:《暴力玩具不能玩》 课件
- 26个英文字母大小写描红
- 养老院预算及成本管理制度
- 研学旅行基地评估认定评分表
- DL∕T 1867-2018 电力需求响应信息交换规范
- 版良性前列腺增生诊疗指南PPT
评论
0/150
提交评论