第14章面向切面编程_第1页
第14章面向切面编程_第2页
第14章面向切面编程_第3页
第14章面向切面编程_第4页
第14章面向切面编程_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、第第1414章章 面向切面编程面向切面编程Spring AOP简介简介 面向切面编程(面向切面编程(AOP)提供另外一种角度来)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编思考程序结构,通过这种方式弥补了面向对象编程(程(OOP)的不足。)的不足。 除了类(除了类(classes)以外,)以外,AOP提供了提供了 切面。切面对关注点进行模块化,切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。例如横切多个类型和对象的事务管理。 在在AOP中,把分散程序各个部分,解决同样中,把分散程序各个部分,解决同样问题的代码片段,称为问题的切面问题的代码片段,称为问题的切面(或

2、方面或方面)。 一个切面可以简单的理解为解决跨越多个模一个切面可以简单的理解为解决跨越多个模块的交叉关注点问题的模块。块的交叉关注点问题的模块。 通过通过AOP可以使用一种非常简单、灵活的方可以使用一种非常简单、灵活的方式,在切面中实现了以前需要在各个核心关注点式,在切面中实现了以前需要在各个核心关注点中穿插的交叉关注的功能,从而使得解决系统中中穿插的交叉关注的功能,从而使得解决系统中交叉关注点问题的模块更加容易设计、实现及维交叉关注点问题的模块更加容易设计、实现及维护。护。 AOP相关框架及工具 AspectJ: 对对java进行了扩展,形成一个功能强进行了扩展,形成一个功能强大、灵活、实用

3、的大、灵活、实用的AOP语言。语言。 AspectWerkz:一个动态、轻量级、性能表现良一个动态、轻量级、性能表现良好的好的AOP框架。框架。 JBoss-AOP:JBoss公司开发的基于方法拦截公司开发的基于方法拦截及源码级数据的及源码级数据的AOP实现框架。实现框架。 Spring-AOP:使用基于代理及拦截器的机制,:使用基于代理及拦截器的机制,与与Spring IOC容器融入一体的容器融入一体的AOP框架。框架。 AOP中的五种AdviceAOP中的相关术语 1)关注点)关注点(Concern) 关注点也就是我们要考察或解决的问题。关注点也就是我们要考察或解决的问题。 把一个系统中的

4、核心功能称为核心关注点跨越把一个系统中的核心功能称为核心关注点跨越多个模块的关注点称为横切关注点或交叉关注点多个模块的关注点称为横切关注点或交叉关注点(Crosscutting Concerns) 。 在在AOP的编程方法中,主要在于对关注点的提的编程方法中,主要在于对关注点的提起及抽象。起及抽象。 2)切面)切面(Aspect) 切面是一个抽象的概念,从软件的角度来说切面是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面。是指在应用程序不同模块中的某一个领域或方面。 AOP中的切面中的切面(aspect)是实现世界领域问是实现世界领域问题的抽象,除了包括属性、方法以

5、外,同时切面题的抽象,除了包括属性、方法以外,同时切面中还包括切入点中还包括切入点Pointcut、增强、增强(advice)等。等。 3)连接点)连接点(Join point) 连接点也就是运用程序执行过程中需要插入连接点也就是运用程序执行过程中需要插入切面模块的某一点。切面模块的某一点。 这个点可以是一个方法、一个属性、构造函这个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。数、类静态初始化块,甚至一条语句。 4)切入点)切入点(Pointcut) 切入点指一个或多个连接点,可以理解成一切入点指一个或多个连接点,可以理解成一个点的集合。切入点的描述比较具体,而且一般个

6、点的集合。切入点的描述比较具体,而且一般会跟连接点上下文环境结合。会跟连接点上下文环境结合。 5)增强或通知)增强或通知(Advice) 增强增强(Advice)里面定义了切面中的实际逻里面定义了切面中的实际逻辑(即实现辑(即实现), 即法增强即法增强(Advice)是指在定义是指在定义好的切入点处,所要执行的程序代码。好的切入点处,所要执行的程序代码。 Spring的AOP简介 AOP是是Spring 框架的重要组成部分。框架的重要组成部分。 Spring AOP使用纯使用纯Java实现,不需要专实现,不需要专门的编译过程。门的编译过程。 Spring没有像没有像AspectJ那样强大的功能

7、,那样强大的功能,只支持与方法调用有关的连接点。只支持与方法调用有关的连接点。 Spring中的中的AOP代理由代理由Spring的的Ioc容器容器负责生成、管理,其依赖关系也由负责生成、管理,其依赖关系也由Ioc容器负责容器负责管理。管理。 AOP编程只需要程序员参加编程只需要程序员参加3个部分:个部分: 定义普通业务组件 定义切入点 定义增强处理Spring有两种方式定义切入点和增强处理:有两种方式定义切入点和增强处理: 基于基于Annotation的方式:使用的方式:使用Aspect、PointCut等等Annotation 基于基于XML配置文件的管理方式:使用配置文件的管理方式:使用

8、Spring的配置文件的配置文件启用启用AspectJ支持支持 为了在为了在Spring配置中使用配置中使用AspectJ aspects,必须首先启用,必须首先启用Spring对基于对基于AspectJ aspects的配置支持,自动代理的配置支持,自动代理(autoproxying)基于通知是否来自这些切面。)基于通知是否来自这些切面。 自动代理是指自动代理是指Spring会判断一个会判断一个bean是否是否使用了一个或多个切面通知,并据此自动生成相使用了一个或多个切面通知,并据此自动生成相应的代理以拦截其方法调用,并且确认通知是否应的代理以拦截其方法调用,并且确认通知是否如期进行。如期进

9、行。 配置文件示例: Spring2支持的AspectJ标签 Aspect标识一个切面; Pointcut标识一个切入点; Before标识一个前置增强; AfterReturning标识返回后增强; AfterThrowing标识异常抛出增强; After标识后增强; Around标识环绕增强; 1)定义切面Bean 当启动了当启动了AspectJ支持后,只要在支持后,只要在Spring容器中配置一个容器中配置一个Aspect注释的注释的Bean,Spring将会自动识别该将会自动识别该Bean,并将该,并将该Bean作为切面处理。作为切面处理。 例如:例如:Aspectpublic cla

10、ss AspectTest 注意:当使用注意:当使用Aspect标注一个标注一个Java类后,类后,Spring将不会把将不会把 该该Bean当成当成Bean组件处理。组件处理。2)定义Before增强处理 使用使用Before标注。标注。 通常需要通过一个通常需要通过一个value属性,指定一个切入点属性,指定一个切入点表达式,用于指定该增强处理将被织入哪些切入点。表达式,用于指定该增强处理将被织入哪些切入点。Aspectpublic class BeforeAdviceTest/执行lee包下所有类的、所有方法都将作为切入点Before(execution(* lee.*.*(.)publ

11、ic void authority()System.out.println(模拟执行权限检查); Componentpublic class Chinese implements Personpublic String sayHello(String name)return name + Hello , Spring AOP;public void eat(String food)System.out.println(我正在吃:+ food);该类可被无限地增强。3)After增强处理 使用使用After标注。标注。 常用属性:常用属性: value:指定该增强处理被织入的切入点。:指定该增强

12、处理被织入的切入点。 与与AfterReturing的区别:的区别: AfterReturing增强处理只有在目标方法成增强处理只有在目标方法成功完成后才会被织入,而功完成后才会被织入,而After增强处理不管目标增强处理不管目标方法如何完成(包括成功完成和遇到异常),它都方法如何完成(包括成功完成和遇到异常),它都会被织入。会被织入。 例如:例如:Aspectpublic class AfterAdviceTest/执行lee包下所有类的、所有方法都将作为切入点After(execution(* lee.*.*(.)public void release()System.out.printl

13、n(模拟方法结束后的释放资源.);4)AfterReturning增强处理 使用使用 AfterReturning标注,将在目标方标注,将在目标方法完成之后被织入。法完成之后被织入。 常用属性:常用属性: pointcut/value:用来指定该切入点对应的切入点表达式。 returning:指定一个返回值形参名,增强处理定义的方法可以通过该形参名来访问目标方法的返回值。例如:例如:Aspectpublic class AfterReturningAdviceTest/执行lee包下所有类的、所有方法都将作为切入点AfterReturning(pointcut=execution(* lee.

14、*.*(.),returning=rvt)public void log(Object rvt)System.out.println(获取目标方法返回值: + rvt);System.out.println(模拟记录日志功能.);5)定义AfterThrowing增强处理 使用使用 AfterThrowing标注,主要用于处理标注,主要用于处理程序中未处理的异常。程序中未处理的异常。 常用属性:常用属性: pointcut/value:指定该切入点对应的切入表达式 throwing:指定一个返回值形参名,增强处理定义的方法可以通过该形参名来访问目标方法中所抛出的异常对象。例如:例如:Aspec

15、tpublic class AfterThrowingAdviceTest/执行lee包下所有类的、所有方法都将作为切入点AfterThrowing(pointcut=execution(* lee.*.*(.), throwing=ex)public void doRecoveryActions(Throwable ex)System.out.println(目标方法中抛出的异常: + ex);System.out.println(模拟抛出异常后的增强处理.); AOP的的AfterThrowing处理与结构化异处理与结构化异常处理的区别:常处理的区别: catch捕捉意味着完全处理该异常,

16、如果catch块中没有重新抛出新异常,则该方法可以正常结束。 AfterThrowing处理虽然处理了该异常,但它不能完全处理该异常,该异常依然会向上传播。6)Around增强处理 使用使用Around标注。标注。 Around增强处理功能更加强大,近似于增强处理功能更加强大,近似于Before和和AfterReturing增强处理的总和。增强处理的总和。 与与Before和和AfterReturing增强处理不同增强处理不同的是:的是:Around增强处理甚至可以决定目标方法在增强处理甚至可以决定目标方法在什么时候被执行,如何执行,甚至可以完全阻止目什么时候被执行,如何执行,甚至可以完全阻止

17、目标方法的执行。标方法的执行。 Around增强处理可以改变执行目标方法的参增强处理可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值。数值,也可以改变执行目标方法之后的返回值。例如:例如:Aspectpublic class AroundAdviceTest/执行lee包下所有类的、所有方法都将作为切入点Around(execution(* lee.*.*(.)public Object processTx(ProceedingJoinPoint jp)throws java.lang.ThrowableSystem.out.println(执行目标方法之前,模拟开始事务.);

18、/执行目标方法,并保存目标方法执行后的返回值Object rvt = ceed(new String被改变的参数);System.out.println(执行目标方法之后,模拟结束事务.);return rvt + 新增的内容; Around增强处理需要通过增强处理需要通过value属性指定属性指定该增强处理被织入的切入点。该增强处理被织入的切入点。 当定义当定义Around增强处理方法时,该方法的增强处理方法时,该方法的第一个参数必须时第一个参数必须时ProceedingJoinPoint类型,类型,在增强处理方法体内,调用在增强处理方法体内,调用ProceedingJoinPo

19、int的的proceed()方法才方法才会执行目标方法。会执行目标方法。 调用调用proceed()时,还可以传入一个时,还可以传入一个Object对象,该数组中的值将被传入目标方对象,该数组中的值将被传入目标方法作为执行方法的实参。法作为执行方法的实参。7)定义切入点)定义切入点 AspectJ和和Spring都允许定义切入点。都允许定义切入点。 所谓定义切入点,实质就是为一个切入点表所谓定义切入点,实质就是为一个切入点表达式起一个名字,从而可以在多个增强处理中重达式起一个名字,从而可以在多个增强处理中重用该名称。用该名称。 切入点定义包括两部分:切入点定义包括两部分: 一个切入点表达式 一

20、个包含名字和任意参数的方法签名 定义切入点使用定义切入点使用Pointcut标注标注Aspectpublic class SystemArchitecture Pointcut(execution(* lee.Chin*.say*(.)public void myPointcut() 若需要使用该切入点,则可在定义增强处理时使用若需要使用该切入点,则可在定义增强处理时使用pointcut参数。参数。AfterReturning(pointcut=SystemArchitecture.myPointcut() , returning=retVal)在下图中展示了如何利用通配符,使多个切面同时在下图中展示了如何利用通配符,使多个切面同时使用一个定义。使用一个定义。XML方式方式 配置配置AOP1)定义切面)定义切面 使用使用元素。元素。 可在该元素中使用可在该元素中使用ref属性为该切面属性为该切面Bean配配置依赖注入。置依赖注入。 常用属性:常用属性: id:定义该切面的标识名 ref:指定引用的Spring Bean作为切面Bean order:指定切面Bean的优先级2)配置增强处理)配

温馨提示

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

评论

0/150

提交评论