《轻量级Java EE程序设计及实践》课件第8章 Spring深入_第1页
《轻量级Java EE程序设计及实践》课件第8章 Spring深入_第2页
《轻量级Java EE程序设计及实践》课件第8章 Spring深入_第3页
《轻量级Java EE程序设计及实践》课件第8章 Spring深入_第4页
《轻量级Java EE程序设计及实践》课件第8章 Spring深入_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

-1-掌握AOP的基本概念及术语掌握各种Advice类的编写方法了解切面的不同类型掌握配置切面的方法了解Spring对事务管理的支持掌握编程式事务管理掌握声明式事务的概念和配置方式目标-2-AOPAOP(AspectOrientedProgramming)即“面向切面编程”AOP利用一种称为“横切”的技术,剖解开封装对象的内部,并将那些影响了多个类的行为封装到一个可重用模块中,并将其命名为“Aspect”,即切面(或称为方面)。通过切面可以将那些与业务无关却为业务模块共同调用的逻辑封装起来,从而减少了系统的重复代码,降低模块间的耦合度,有利于系统的可维护性和可扩展性OOP提高了代码的重用,而AOP将分散在各个业务逻辑中的相同代码,通过横向切割的方式抽取成一个独立的模块,使得业务逻辑类更加简洁明-3-AOP相关概念连接点(Joinpoint)切入点(Pointcut)增强(Advice)目标对象(Target)引入(Introduction)织入(Weaving)代理(Proxy)切面(Aspect)在AOP编程过程中,需要开发人员参与的有三个方面:定义普通业务类定义切入点,一个切入点可能横切多个业务组件定义增强,增强就是在AOP框架为普通业务组件织入的处理逻辑-4-SpringAOP增强类型-1根据增强在目标类连接点的位置不同,Spring框架支持五种类型的增强:前置增强后置增强返回后增强抛出异常后增强环绕增强定义方式:基于XML配置文件的管理方式:使用Spring配置文件来定义切入点和增强基于Annotation的“零配置”方式:使用@Aspect、@Pointcut等注解来定义切入点和增强-5-SpringAOP增强类型-2<aop:before…/>:配置Before增强处理<aop:after…/>:配置After增强处理<aop:after-returning…/>:配置AfterReturning增强处理<aop:after-throwing…/>:配置AfterThrowing增强处理<aop:around…/>:配置Aroud增强处理属性名描述pointcut该属性指定一个切入点表达式,Spring将在匹配该表达式的连接点时织入该增强pointcut-ref该属性指定一个已经存在的切入点名称,通常pointcut和pointcut-ref两个属性只需使用其中之一method该属性指定一个方法名,它对应切面中所定义的增强逻辑方法throwing该属性只对<after-throwing…/>元素有效,用于指定一个形参名,AfterThrowing增强处理方法可以通过该形参访问目标方法所抛出的异常returning该属性只对<after-returning…/>元素有效,用于指定一个形参名,AfterReturning增强处理方法可以通过该形参访问目标方法的返回值-6-基于XML–配置切面属性名描述id定义该切面的标识名ref指定该属性所引用的普通Bean作为切面Beanorder指定该切面Bean的优先级,order值越小,该切面对应的优先级越高publicclassAspectBean{ publicvoidcheckAuth(){System.out.println("权限检查...");} publicvoidrelease(){System.out.println("最后释放资源...");} publicvoidlog(Objectresult){ if(result==null) System.out.println("数据库中无结果!"); else System.out.println("数据库中有结果!"); } publicvoidprocessException(Throwableex){ System.out.println("异常信息为:"+ex.getMessage()); } publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("开始事务..."); ceed(); System.out.println("提交事务..."); }}<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd/schema/aop /schema/aop/spring-aop-2.5.xsd"> <aop:config> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--还没有配置增强--> </aop:aspect> </aop:config> <!--配置日志切面--> <beanid="aspectBean" class="com.dh.ch08.aspect.AspectBean"/></beans>-7-基于XML–配置增强publicinterfaceUserService{ /** *模拟删除操作 */ publicvoiddel(); /** *模拟添加操作 */ publicvoidadd(); /** *模拟更新操作 */ publicvoidupdate(); /** *模拟查询操作 */ publicObjectselect();}publicclassUserServiceImplimplementsUserService{ publicvoiddel(){ System.out.println("删除一个User对象"); } publicvoidadd(){ System.out.println("添加一个User对象"); } publicvoidupdate(){ System.out.println("更新一个User对象"); } publicObjectselect(){ System.out.println("模拟查询了多个User对象"); returnnull; }}<aop:configproxy-target-class="true"> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--配置Before增强,以切面Bean中的checkAuth()方法作为增强处理方法--> <aop:beforemethod="checkAuth" pointcut="execution(*com..*.*Service.*(..))"/> <!--配置AfterReturning增强,以切面中的log()方法作为增强处理方法--> <aop:after-returningmethod="log" pointcut="execution(*com..*.*Service.select(..))" returning="result"/> <!--配置AfterThrowing增强,以切面中的processException方法作为增强处理方法--> <aop:after-throwingmethod="processException" pointcut="execution(*com..*.*Service.*(..))" throwing="ex"/> <!--配置Around增强,以切面中的processTrans()方法作为增强处理方法--> <aop:aroundmethod="proceedInTrans" pointcut="execution(*com..*.*Service.*(..))"/> <!--配置After增强,以切面Bean中的release()方法作为增强处理方法--> <aop:aftermethod="release" pointcut="execution(*com..*.*Service.*(..))"/> </aop:aspect></aop:config><!--配置日志切面--><beanid="aspectBean"class="com.dh.ch08.aspect.AspectBean"/><!--配置UserService类--><beanid="userService"class="com.dh.ch08.service.UserServiceImpl"/>-8-基于XML–配置切入点<aop:configproxy-target-class="true">

<aop:pointcutid="mypointcut" expression="execution(*com..*.*Service.*(..))"/> <aop:aspectid="adviceAspect"ref="aspectBean"> <!--配置before增强--> <aop:beforemethod="checkAuth"

pointcut-ref="mypointcut"/> </aop:aspect></aop:config>-9-基于XML–切入点指示符名称描述execution用来匹配执行方法的连接点,它是SpringAOP中最主要的切入点指示符within限定匹配特定类型的连接点,当使用SpringAOP的时候,只能匹配方法执行的连接点this用于限定AOP代理必须是指定类型的实例,用于匹配该对象的所有连接点。当使用SpringAOP的时候,只能匹配方法执行的连接点target用于限定目标对象必须是指定类型的实例,用于匹配该对象的所有连接点。当使用SpringAOP的时候,只能匹配方法执行的连接点args用于对连接点的参数类型进行限制,要求参数类型是指定类型的实例。当使用SpringAOP的时候,只能匹配方法执行的连接点execution(public**(..))execution(*find*(..))execution(*com.dh.ch08.service.UserService.*(..))execution(*com.dh.ch08.service.UserService+.*(..))execution(*com.dh.ch08.*(..))execution(*com.dh.ch08..*(..))execution(*com..*.*Service.find*(..))execution(*com..ch08..*Service.find*(..))execution(*foo(String,int))execution(*foo(String,..))within(com.dh.ch08..*)this(com.dh.ch08.service.UserService)target(com.dh.ch08.service.UserService)args(com.dh.ch08.pojos.User)-10-基于XML–组合切入点execution(*com.dh..*(..))&&args(com.dh.ch08.pojos.User)Spring支持使用3个逻辑运算符来组合切入点表达式:&&:要求连接点同时匹配两个切入点表达式||:只要求连接点匹配任意一个切入点表达式!:要求连接点不匹配指定切入点表达式-11-基于Annotation–配置切面<aop:aspectj-autoproxy/>AspectJ是一个基于Java语言的AOP框架,它扩展了标准Java,从语言层面提供了强大的AOP功能。在配置文件中配置启动AspectJ@AspectpublicclassAspectBean{......省略其他内容}-12-基于Annotation–配置增强AspectJ提供的几个主要的增强注解:@Before前置增强@AfterReturning返回后增强@Around环绕增强@AfterThrowing抛出增强@After

后置增强@AspectpublicclassAspectBean{

@Before("execution(*com..*.*Service.*(..))") publicvoidcheckAuth(){System.out.println("权限检查...");}

@After("execution(*com..*.*Service.*(..))") publicvoidrelease(){System.out.println("最后释放资源...");}

@AfterReturning(returning="result",pointcut="execution(*com..*.*Service.select(..))") publicvoidlog(Objectresult){ if(result==null) System.out.println("数据库中无结果!"); else System.out.println("数据库中有结果!"); }

@AfterThrowing(pointcut="execution(*com..*.*Service.*(..))",throwing="ex") publicvoidprocessException(Throwableex){ System.out.println("异常信息为:"+ex.getMessage()); }

@Around("execution(*com..*.*Service.*(..))") publicvoidproceedInTrans(ProceedingJoinPointjoinpoint) throwsThrowable{ System.out.println("开始事务..."); ceed(); System.out.println("提交事务..."); }}-13-基于Annotation–配置切入点@AspectpublicclassAspectBean{ /** *使用@Pointcut来配置切入点 */ @Pointcut("execution(*com..*.*Service.*(..))") privatevoidcrud(){}; /** *模拟进行权限检查 */

@Before("crud()") publicvoidcheckAuth(){ System.out.println("权限检查..."); }......省略}切入点可以通过@Pointcut进行声明。一个切入点的声明有两部分组成,一个是包含名字和任意参数的签名,另一个是切入点表达式示例8.3-14-Spring事务策略JavaEE应用的事务策略有全局事务和局部事务两种全局事务通常由应用服务器管理,需要底层应用服务器(例如WebLogic和WebSphere等)的JTA支持,EJB事务就是建立在JTA的基础上,而JTA又必须通过JNDI获取,这就意味着无论用户的应用是跨多个事务性资源(如关系型数据库和消息队列等)的使用还是单一事务性资源的使用,EJB都要求使用全局事务加以处理,这样基于EJB的应用就无法脱离应用服务器的环境局部事务是基于单一事务性资源的,通常和底层的持久化技术有关,例如,当采用JDBC时,需要使用Connection对象来操作事务,当采用Hibernate持久化技术时,需要使用Session对象操作事务。当使用局部事务时,应用服务器不需要参与事务管理,因此不能保证跨多个事务性资源的事务的正确性,不过绝大部分应用都是基于单一事务性资源的,只有很少的应用需要使用多事务性资源的JTA事务-15-XML配置声明式事务–数据源<!--数据源的配置--><beanid="dataSource"class="mons.dbcp.BasicDataSource“> <!--指定连接数据库的驱动--> <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> <!--指定连接数据库的URL--> <propertyname="url"value="jdbc:mysql://localhost:3306/test"/> <!--指定连接数据库的用户名--> <propertyname="username"value="root"/> <!--指定连接数据库的密码--> <propertyname="password"value="root"/> <!--指定连接数据库的连接池的初始化大小--> <propertyname="initialSize"value="5"/> <!--指定连接数据库的连接池最大连接数--> <propertyname="maxActive"value="100"/> <!--指定连接数据库的连接池最大空闲时间--> <propertyname="maxIdle"value="30"/> <!--指定连接数据库的连接池最大等待时间--> <propertyname="maxWait"value="1000"/></bean>-16-XML配置声明式事务–事务增强<!--事务管理器的配置--><beanid="txManager“class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="dataSource"/></bean>

<!--事务增强配置--><tx:adviceid="txAdvice"transaction-manager="txManager"> <!--事务属性定义--> <tx:attributes> <tx:methodname="get*"read-only="true"/> <tx:methodname="add*"rollback-for="Exception"/> <tx:methodname="update*"/> <tx:methodname="del*"/> </tx:attributes></tx:advice>-17-XML配置声明式事务–事务切面<!--通过AOP配置事务增强切面--><aop:config> <aop:pointcutexpression="execution(*com..*.*Service.*(..))" id="allMethods"/> <aop:advisoradvice-ref="txAdvice"pointcut-ref="allMethods"/></aop:config><!--配置UserService类--><beanid="userService"class="co

温馨提示

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

评论

0/150

提交评论