北大青鸟spring入门课程TP4.ppt_第1页
北大青鸟spring入门课程TP4.ppt_第2页
北大青鸟spring入门课程TP4.ppt_第3页
北大青鸟spring入门课程TP4.ppt_第4页
北大青鸟spring入门课程TP4.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 四 章,Spring AOP 的应用,回顾,AOP的目的即在正常的业务操作之外增加的附加操作 通过切入点(pointcut)指名进行哪些切面(aspect)操作 ProxyFactoryBean interceptorNames targetName proxyInterfaces 拦截器(Interceptor),通知(Advice),和切面的不同(Aspect),2,AOP的应用,事务切面 日志切面 其它附加操作切面,3,事务切面,在介绍事务切面之前,回顾网上银行的项目,并使用Spring IOC注入业务实现类所需的sessionFactory 实现步骤和问题思考: 实现业务接口和业务实现类(AccountService、LogService) sessionFactory如何注入的,应该注入给谁? 事务由谁来管理?,4,优化,现在项目经理提出需求,希望改进代码的结构,达到如下目标: transfer方法(或其它业务方法)在执行时,事务自动开始 在正确完成后,事务提交,并且关闭hibernate session 在出现RuntimeException(或其子类)异常时,事务回滚,并关闭hibernate session 其他异常,仍执行提交关闭的操作,5,Spring的解决方案,方案A:使用事务拦截器并代理业务实现类 方案B:使用事务advice 和aspect 切面来实现事务拦截,6,方案A,第一步,改写AccountService业务实现类 第二步,定义ProxyFactoryBean以返回AccountService代理对象 proxyInterfaces targetName interceptorNames 这里添加事务拦截器,7,事务拦截器,第三步定义事务拦截器,8, PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW ,事务属性以及 事务管理器,Show Time,修改perties,以便观察Spring执行过程 .springframework.aop=debug .springframework.transaction=debug .springframework.orm.hibernate3=debug,9,事务管理器,Spring由于需要为多种数据层的实现提供集成支持,针对不同的情况,定义了各种事务管理器,一定要选择正确的事务管理器 比如: DataSourceTransactionManager 对应JDBC事务 HibernateTransactionManager 对应Hibernate提供的事务 JtaTransactionManager 对应JTA事务 大多数事务管理器都需要设置dataSource(数据源)属性,对于HibernateTransactionManager可以只设置sessionFactory属性,10,事务属性,常见的事务属性有: 事务的传播行为 事务的隔离级别 事务是否只读 针对只读事务,Spring在某些情况下会提供优化,11,事务的传播行为,以下的定义可以在TransactionDefinition中找到 PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED PROPAGATION_NEVER,12,事务的传播行为,PROPAGATION_REQUIRED表示如果没有事务,则开始新的事务,事务已经存在,则加入当前事务 PROPAGATION_SUPPORTS 表示如果事务已经存在,则加入当前事务,如果没有事务,不会开始新事务 PROPAGATION_MANDATORY 表示必须有事务存在,并加入当前事务,否则抛出异常 PROPAGATION_REQUIRES_NEW 表示每次都开始一个全新事务 PROPAGATION_NOT_SUPPORTED 表示不会开始或加入事务 PROPAGATION_NEVER 表示不会开始或加入事务,如果事务已存在,抛出异常,13,事务的隔离级别,以下的定义可以在TransactionDefinition中找到 ISOLATION_READ_UNCOMMITTED ISOLATION_READ_COMMITTED ISOLATION_REPEATABLE_READ ISOLATION_SERIALIZABLE,14,事务的隔离级别,首先明确隔离级别指的都是同一个事务中 ISOLATION_READ_UNCOMMITTED表示会读取到未提交的数据 ISOLATION_READ_COMMITTED表示读取到的是已经提交的数据 ISOLATION_REPEATABLE_READ表示多次读取的数据是相同的 ISOLATION_SERIALIZABLE表示就好像没有别的用户在修改数据库中的数据一样,15,如何使用隔离级别,对于大多数数据库来说,事务的隔离级别是ISOLATION_READ_COMMITTED,我们不需要做更多的设置,就可以很好的工作了 将事务的隔离级别设置为ISOLATION_REPEATABLE_READ可以防止丢失更新,但这样做会严重影响系统的并发性,因此更多地是采用乐观锁的形式 ISOLATION_SERIALIZABLE并非你想象中的锁定一切!,16,继续完成需求,第四步,完成LogService业务实现类及其代理对象的定义,修改事务拦截器 第五步,定义一个Advice实现ThrowsAdvice和MethodBeforeAdvice 以便处理日志和其它附加逻辑 第六步,将此Advice 添加至合适的位置,17,流程分析,当事务拦截器中的设置如下时,18,PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW,执行顺序,执行AccountService代理的transfer方法 检查此代理定义的所有拦截器(有事务拦截器,和一个Advice) 根据transfer方法事务的传播规则(REQUIRED),开启一个新的事务Tx_A,打开Session_A 因为Advice实现了MethodBeforeAdvice接口,因此首先执行Advice中的before方法 Before方法中,使用了LogService代理的log方法 检查LogService代理定义的拦截器(有事务拦截器) 根据log方法的传播规则(REQUIRES_NEW),又开启一个新的事务Tx_B,打开Session_B 执行log方法 当log方法成功执行,Tx_B提交,Session_B关闭 执行transfer方法 当transfer方法成功执行,Tx_A提交,Session_A关闭,19,当transfer发生异常,执行AccountService代理的transfer方法 检查此代理定义的所有拦截器(有事务拦截器,和一个Advice) 根据transfer方法事务的传播规则(REQUIRED),开启一个新的事务Tx_A,打开Session_A 因为Advice实现了MethodBeforeAdvice接口,因此首先执行Advice中的before方法 Before方法中,使用了LogService代理的log方法 检查LogService代理定义的拦截器(有事务拦截器) 根据log方法的传播规则(REQUIRES_NEW),又开启一个新的事务Tx_B,打开Session_B 执行log方法 当log方法成功执行,Tx_B提交,Session_B关闭 执行transfer方法 当transfer方法抛出异常,执行Advice 的afterThrowing 方法 Tx_A回滚,Session_A关闭,20,流程分析,当事务拦截器中的设置如下时,21,PROPAGATION_REQUIRED PROPAGATION_REQUIRED,执行顺序,执行AccountService代理的transfer方法 检查此代理定义的所有拦截器(有事务拦截器,和一个Advice) 根据transfer方法事务的传播规则(REQUIRED),开启一个新的事务Tx_A,打开Session_A 因为Advice实现了MethodBeforeAdvice接口,因此首先执行Advice中的before方法 Before方法中,使用了LogService代理的log方法 检查LogService代理定义的拦截器(有事务拦截器) 根据log方法的传播规则( REQUIRED ),加入当前的事务Tx_A 执行log方法 执行transfer方法 当transfer方法成功执行,Tx_A提交,Session_A关闭,22,当transfer发生异常,执行AccountService代理的transfer方法 检查此代理定义的所有拦截器(有事务拦截器,和一个Advice) 根据transfer方法事务的传播规则(REQUIRED),开启一个新的事务Tx_A,打开Session_A 因为Advice实现了MethodBeforeAdvice接口,因此首先执行Advice中的before方法 Before方法中,使用了LogService代理的log

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论