《Spring编程技术与应用》课件8_第1页
《Spring编程技术与应用》课件8_第2页
《Spring编程技术与应用》课件8_第3页
《Spring编程技术与应用》课件8_第4页
《Spring编程技术与应用》课件8_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

8.1AOP概述8.1.1AOP的术语切面(Aspect):描述的是一个应用系统的某一个方面或领域,例如:日志,事务,权限检查等。连接点(Joinpoint):连接点是应用程序执行过程中插入切面的点,这些点可能是方法的调用,异常抛出或字段的修改等。Spring只支持方法的Joinpoint,也就是Advice将在方法执行的前后被应用。通知(Advice):表示切面的行为,具体表现为实现切面逻辑的一个方法。常见通知有:before、after及around等。切入点(Pointcut):切入点指定了通知应当应用在哪些连接点上,Pointcut切点通过正则表达式定义方法集合。切入点由一系列切入点指示符通过逻辑运算组合得到,AspeetJ的常用切入点指示符包括:execution、call、initialization、handler、get、set、this、target、args、within等。目标对象(Target):目标对象是指被通知的对象。注意,Spring中,Target必须实现预先定义好的接口,这样才会使用Proxy进行动态代理。代理(Proxy):代理是指将通知应用到目标对象后形成的新的对象。它实现了与目标对象一样的功能,在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。如果目标对象没有实现任何接口,那么Spring将使用CGLIB来实现代理。如果目标对象实现了一个以上的接口,那么Spring将使用JDKProxy来实现代理,因为Spring默认使用的就是JDKProxy,这符合Spring提倡面向接口编程的思想。织入(Weaving):织入是指将切面应用到目标对象从而建立一个新的代理对象的过程,切面在指定的接入点被织入目标对象中,织入一般可发生在对象的编译期,类装载期或运行期,而Spring的AOP采用的是运行期织入。8.1.2AOP的优点

(1)代码集中。解决了由于OOP跨模块造成的代码纠缠和代码分散问题。

(2)模块化横切关注点。核心业务级关注点与横切关注点分离开,降低横切模块与核心模块的耦合度,实现了软件工程中的高内聚、低耦合的要求。增强了程序的可读性,并且使系统更容易维护。

(3)系统容易扩展。AOP的基本业务模块不知道横切关注点的存在,很容易通过建立新的切面加入新的功能。另外,当系统中加入新的模块时,已有的切面自动横切进来,使系统易于扩展。

(4)提高代码重用性。AOP把每个Aspect实现为独立的模块,模块之间松散藕合,意味着更高的代码重用性。8.1.3AspectJ的切点表达式函数AspectJ的切点表达式由关键字和操作参数组成,例如,以下切点表达式:execution(*chapter8.moniter.print(..))为了描述方便,不妨将execution()称作函数,而将匹配串称作函数的入参。切入表达式中特殊符号. 匹配除换行符外的任意单个字符* 匹配任何类型的参数串.. 匹配任意的参数,0到多个。Spring支持9个@AspectJ切点表达式函数,类别函数入参说明方法切点函数execution()方法匹配模式串表示满足某一匹配模式的所有目标类方法连接点。@annotation()方法注解类名表示标注了特定注解的目标方法连接点。方法入参切点函数args()类名通过判别目标类方法运行时入参对象的类型定义指定连接点。@args()类型注解类名通过判别目标方法的运行时入参对象的类是否标注特定注解来指定连接点。目标类切点函数within()类名匹配串限制在特定域下的所有连接点。如within(ecjtu.service.*)表示ecjtu.service包中的所有连接点,即包中所有类的所有方法。target()类名限制匹配的连接点其对应的被代理的目标对象为给定类型的实例。@within()类型注解类名如@within(ecjtu.Monitor)定义的切点,假如Y类标注了@Monitor注解,则Y的所有连接点都匹配这个切点。@target()类型注解类名目标类标注了特定注解,则目标类所有连接点匹配该切点。代理类切点函数this()类名限制匹配的连接点其对应的SpringAOP代理Bean引用为给定类型的实例。execution(*set*(..))表示执行任何以set作为前缀的方法。within(com.service.*)表示执行service包中的任何连接点的方法。this(com.service.AccountService)表示以AccountService接口对象作为代理的连接点在SpringAOP中执行。另外,SpringAOP还提供了名为bean切点指示符,用于指定Bean实例的连接点。定义表达式时需要传入Bean的id或name。表达式参数允许使用“*”通配符。例如,bean(*book)表示匹配所有名字以book结尾的Bean。要匹配Bean的某个方法可以通过args参数进行指定。例如:

@Before("bean(sampleBean)&&args()")表示给sampleBean所代表对象的所有无参方法执行前加入切面逻辑。8.2简单AOP应用示例1.配置文件<context:component-scanbase-package="chapter8"/><aop:aspectj-autoproxy/><beanid="sampleBean"class="chapter8.work"/>2.业务逻辑接口【程序清单8-2】文件名为Sample.javapackagechapter8;publicinterfaceSample{ publicvoidsome();publicvoidother(Strings)throwsException;}注意,为了让Spring自动利用JDK的代理功能,定义接口有必要。用接口定义业务规范也是良好的程序设计风格。3.业务逻辑实现【程序清单8-3】业务逻辑实现(文件名为work.java)packagechapter8;publicclassworkimplementsSample{ publicvoidsome(){ System.out.println("dosomething.."); }publicvoidother(Strings)throwsException{System.out.println(s); thrownewException("somethingiswrong."); } }4.切面逻辑packagechapter8;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.*importorg.springframework.stereotype.Component;@Aspect@Component//实现切面在IOC容器中的注册publicclassAspectlogic{/*声明BeforeAdvice,并直接指定切入点表达式,也就是chapter8包下work类的some方法作为切入点,在该方法执行前执行切面逻辑*/

@Before("execution(*chapter8.work.some(..))")

publicvoidexecute(){//切面逻辑的方法

System.out.println("BeforeMethodstartedexcuting...");}}也可以先用@Pointcut定义切入点表达式,再将其应用到通知定义中,这样的好处是一次定义,以后可多处使用,具体代码如下:publicclassAspectlogic{//定义切入点@Pointcut("execution(*chapter8.work.some(..))")publicvoidmypoint(){}//用来标注切入点的方法必须是一个空方法

//以下利用切入点定义Before通知@Before("mypoint()")//也可写成:@Before(pointcut="mypoint()")

publicvoidexecute(){//切面逻辑的方法System.out.println("BeforeMethodstartedexcuting...");}}【输出结果】运行Tester应用程序,结果如下:BeforeMethodstartedexcuting...dosomething..hellohaveException!5.测试调用publicclassTester{ publicstaticvoidmain(String[]args){ ApplicationContextcontext=new ClassPathXmlApplicationContext("adviceContext.xml"); Samplesample=(Sample)context.getBean("sampleBean");

sample.some();try{

sample.other("hello"); }catch(Exceptione){System.out.println("haveException!");} }}8.3Spring切面定义说明8.3.1Spring的通知类型Spring可定义5类通知。它们是:Before通知AfterReturning通知AfterThrowing通知After通知Around通知。在同时定义了多个通知时,通知的执行次序与优先级有关,以下为通知优先级由低到高的顺序:Before通知--->Around通知--->AfterReturning通知--->After通知

在定义Around通知的切面逻辑方法时,必须给方法至少加入ProceedingJoinPoint类型的参数,在方法内调用ProceedingJoinPoint的proceed()方法才会执行目标方法。调用ProceedingJoinPoint的proceed()方法时,还可以传入一个Object[]对象,该数组中的数据将作为目标方法的实参。以下为具体举例:@Around(value="mypoint()")publicObjectprocess(ProceedingJoinPointpj){ Objectres=null; try{ res=ceed(newString[]{"新参数"}); }catch(Throwablee){ e.printStackTrace(); } System.out.println("结果="+res); returnres+"更改";}8.3.2访问目标方法的参数访问目标方法最简单的做法是在定义通知时将第一个参数定义为JoinPoint类型的参数,该JoinPoint参数就代表了织入通知的连接点,JoinPoint内包含如下常用方法,通过它们可传递信息:Object[]getArgs():返回执行目标方法时的参数;SignaturegetSignature():返回切面逻辑方法的相关信息;ObjectgetTarget():返回被织入切面逻辑的目标对象;ObjectgetThis():返回AOP框架为目标对象生成的代理对象。获取目标方法的相关信息@After("mypoint()")publicvoidexecute2(JoinPointjp)

温馨提示

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

评论

0/150

提交评论