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

下载本文档

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

文档简介

第14章

面向切面编程SpringAOP简介

面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。在AOP中,把分散程序各个部分,解决同样问题的代码片段,称为问题的切面(或方面)。一个切面可以简单的理解为解决跨越多个模块的交叉关注点问题的模块。通过AOP可以使用一种非常简单、灵活的方式,在切面中实现了以前需要在各个核心关注点中穿插的交叉关注的功能,从而使得解决系统中交叉关注点问题的模块更加容易设计、实现及维护。AOP相关框架及工具AspectJ:对java进行了扩展,形成一个功能强大、灵活、实用的AOP语言。AspectWerkz:一个动态、轻量级、性能表现良好的AOP框架。JBoss-AOP:JBoss公司开发的基于方法拦截及源码级数据的AOP实现框架。

Spring-AOP:使用基于代理及拦截器的机制,与SpringIOC容器融入一体的AOP框架。

AOP中的五种AdviceAOP中的相关术语

1)关注点(Concern)

关注点也就是我们要考察或解决的问题。把一个系统中的核心功能称为核心关注点跨越多个模块的关注点称为横切关注点或交叉关注点(CrosscuttingConcerns)。在AOP的编程方法中,主要在于对关注点的提起及抽象。2)切面(Aspect)

切面是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面。

AOP中的切面(aspect)是实现世界领域问题的抽象,除了包括属性、方法以外,同时切面中还包括切入点Pointcut、增强(advice)等。3)连接点(Joinpoint)

连接点也就是运用程序执行过程中需要插入切面模块的某一点。这个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。4)切入点(Pointcut)

切入点指一个或多个连接点,可以理解成一个点的集合。切入点的描述比较具体,而且一般会跟连接点上下文环境结合。5)增强或通知(Advice)

增强(Advice)里面定义了切面中的实际逻辑(即实现),即法增强(Advice)是指在定义好的切入点处,所要执行的程序代码。Spring的AOP简介

AOP是Spring框架的重要组成部分。

SpringAOP使用纯Java实现,不需要专门的编译过程。

Spring没有像AspectJ那样强大的功能,只支持与方法调用有关的连接点。

Spring中的AOP代理由Spring的Ioc容器负责生成、管理,其依赖关系也由Ioc容器负责管理。

AOP编程只需要程序员参加3个部分:定义普通业务组件定义切入点定义增强处理Spring有两种方式定义切入点和增强处理:基于Annotation的方式:使用@Aspect、@PointCut等Annotation基于XML配置文件的管理方式:使用Spring的配置文件启用@AspectJ支持为了在Spring配置中使用@AspectJaspects,必须首先启用Spring对基于@AspectJaspects的配置支持,自动代理(autoproxying)基于通知是否来自这些切面。自动代理是指Spring会判断一个bean是否使用了一个或多个切面通知,并据此自动生成相应的代理以拦截其方法调用,并且确认通知是否如期进行。

配置文件示例:

<?xmlversion="1.0"encoding="GBK"?><beansxmlns="http:///schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="http:///schema/context"xmlns:aop="http:///schema/aop"xsi:schemaLocation="http:///schema/beans/schema/beans/spring-beans-2.5.xsdhttp:///schema/context/schema/context/spring-context-2.5.xsdhttp:///schema/aop/schema/aop/spring-aop-2.5.xsd"><context:component-scanbase-package="lee"><context:include-filtertype="annotation"expression="org.aspectj.lang.annotation.Aspect"/></context:component-scan><aop:aspectj-autoproxy/></beans>Spring2支持的AspectJ标签@Aspect-标识一个切面;@Pointcut-标识一个切入点;@Before-标识一个前置增强;@AfterReturning-标识返回后增强;@AfterThrowing-标识异常抛出增强;@After-标识后增强;@Around-标识环绕增强;1)定义切面Bean

当启动了@AspectJ支持后,只要在Spring容器中配置一个@Aspect注释的Bean,Spring将会自动识别该Bean,并将该Bean作为切面处理。例如:@AspectpublicclassAspectTest{}

注意:当使用@Aspect标注一个Java类后,Spring将不会把该Bean当成Bean组件处理。2)定义Before增强处理使用@Before标注。通常需要通过一个value属性,指定一个切入点表达式,用于指定该增强处理将被织入哪些切入点。@AspectpublicclassBeforeAdviceTest{//执行lee包下所有类的、所有方法都将作为切入点@Before("execution(*lee.*.*(..))")publicvoidauthority(){System.out.println("模拟执行权限检查");}}

@ComponentpublicclassChineseimplementsPerson{publicStringsayHello(Stringname){returnname+"Hello,SpringAOP";}publicvoideat(Stringfood){System.out.println("我正在吃:"+food);}}该类可被无限地增强。3)After增强处理

使用@After标注。常用属性:

value:指定该增强处理被织入的切入点。与AfterReturing的区别:

AfterReturing增强处理只有在目标方法成功完成后才会被织入,而After增强处理不管目标方法如何完成(包括成功完成和遇到异常),它都会被织入。

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

rvt){System.out.println("获取目标方法返回值:"+rvt);System.out.println("模拟记录日志功能...");}}5)定义AfterThrowing增强处理使用@AfterThrowing标注,主要用于处理程序中未处理的异常。常用属性:pointcut/value:指定该切入点对应的切入表达式throwing:指定一个返回值形参名,增强处理定义的方法可以通过该形参名来访问目标方法中所抛出的异常对象。例如:@AspectpublicclassAfterThrowingAdviceTest{//执行lee包下所有类的、所有方法都将作为切入点@AfterThrowing(pointcut="execution(*lee.*.*(..))",throwing="ex")publicvoiddoRecoveryActions(Throwableex){System.out.println("目标方法中抛出的异常:"+ex);System.out.println("模拟抛出异常后的增强处理...");}}

AOP的AfterThrowing处理与结构化异常处理的区别:catch捕捉意味着完全处理该异常,如果catch块中没有重新抛出新异常,则该方法可以正常结束。AfterThrowing处理虽然处理了该异常,但它不能完全处理该异常,该异常依然会向上传播。6)Around增强处理

使用@Around标注。

Around增强处理功能更加强大,近似于Before和AfterReturing增强处理的总和。与Before和AfterReturing增强处理不同的是:Around增强处理甚至可以决定目标方法在什么时候被执行,如何执行,甚至可以完全阻止目标方法的执行。

Around增强处理可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值。例如:@AspectpublicclassAroundAdviceTest{//执行lee包下所有类的、所有方法都将作为切入点@Around("execution(*lee.*.*(..))")publicObjectprocessTx(ProceedingJoinPoint

jp)throwsjava.lang.Throwable{System.out.println("执行目标方法之前,模拟开始事务...");//执行目标方法,并保存目标方法执行后的返回值Objectrvt=ceed(newString[]{"被改变的参数"});System.out.println("执行目标方法之后,模拟结束事务...");returnrvt+"新增的内容";}}

Around增强处理需要通过value属性指定该增强处理被织入的切入点。当定义Around增强处理方法时,该方法的第一个参数必须时ProceedingJoinPoint类型,在增强处理方法体内,调用ProceedingJoinPoint的proceed()方法才会执行目标方法。调用proceed()时,还可以传入一个Object[]对象,该数组中的值将被传入目标方法作为执行方法的实参。7)定义切入点

AspectJ和Spring都允许定义切入点。所谓定义切入点,实质就是为一个切入点表达式起一个名字,从而可以在多个增强处理中重用该名称。切入点定义包括两部分:一个切入点表达式一个包含名字和任意参数的方法签名定义切入点使用@Pointcut标注@AspectpublicclassSystemArchitecture

{@Pointcut("execution(*lee.Chin*.say*(..))")publicvoidmyPointcut(){}}

若需要使用该切入点,则可在定义增强处理时使用pointcut参数。@AfterReturning(pointcut="SystemArchitecture.myPointcut()",returning="retVal")在下图中展示了如何利用通配符,使多个切面同时使用一个定义。XML方式配置AOP1)定义切面使用<aop:aspect…/>元素。可在该元素中使用ref属性为该切面Bean配置依赖注入。常用属性:id:定义该切面的标识名ref:指定引用的SpringBean作为切面Beanorder:指定切面Bean的优先级2)配置增强处理使用XML配置增强处理使用以下几个元素:<aop:before…/><aop:after…/><aop:after-

温馨提示

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

评论

0/150

提交评论