《Spring编程技术与应用》课件8.ppt

上传人(卖家):momomo 文档编号:5818467 上传时间:2023-05-11 格式:PPT 页数:17 大小:293.50KB
下载 相关 举报
《Spring编程技术与应用》课件8.ppt_第1页
第1页 / 共17页
《Spring编程技术与应用》课件8.ppt_第2页
第2页 / 共17页
《Spring编程技术与应用》课件8.ppt_第3页
第3页 / 共17页
《Spring编程技术与应用》课件8.ppt_第4页
第4页 / 共17页
《Spring编程技术与应用》课件8.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、8.1 AOP概述8.1.1 AOP的术语切面切面(Aspect):描述的是一个应用系统的某一个方面或领域,例如:日志,事务,权限检:描述的是一个应用系统的某一个方面或领域,例如:日志,事务,权限检查等。查等。连接点连接点(Joinpoint):连接点是应用程序执行过程中插入切面的点,这些点可能是方法的:连接点是应用程序执行过程中插入切面的点,这些点可能是方法的调用,异常抛出或字段的修改等。调用,异常抛出或字段的修改等。Spring只支持方法的只支持方法的Joinpoint,也就是,也就是Advice将在方将在方法执行的前后被应用。法执行的前后被应用。通知通知(Advice):表示切面的行为,

2、具体表现为实现切面逻辑的一个方法。常见通知有:表示切面的行为,具体表现为实现切面逻辑的一个方法。常见通知有:before、after 及及around等。等。切入点切入点(Pointcut):切入点指定了通知应当应用在哪些连接点上,:切入点指定了通知应当应用在哪些连接点上,Pointcut切点通过正则切点通过正则表达式定义方法集合。切入点由一系列切入点指示符通过逻辑运算组合得到,表达式定义方法集合。切入点由一系列切入点指示符通过逻辑运算组合得到,AspeetJ的的常用切入点指示符包括常用切入点指示符包括:execution、call、initialization、handler、get、set

3、、this、target、args、within等。等。目标对象目标对象(Target):目标对象是指被通知的对象。注意,:目标对象是指被通知的对象。注意,Spring中,中,Target必须实现预必须实现预先定义好的接口,这样才会使用先定义好的接口,这样才会使用Proxy进行动态代理。进行动态代理。代理代理(Proxy):代理是指将通知应用到目标对象后形成的新的对象。它实现了与目标对象:代理是指将通知应用到目标对象后形成的新的对象。它实现了与目标对象一样的功能,在一样的功能,在Spring中,中,AOP代理可以是代理可以是JDK动态代理或动态代理或CGLIB代理。如果目标对象代理。如果目标对

4、象没有实现任何接口,那么没有实现任何接口,那么Spring将使用将使用CGLIB来实现代理。如果目标对象实现了一个以来实现代理。如果目标对象实现了一个以上的接口,那么上的接口,那么Spring将使用将使用JDK Proxy来实现代理,因为来实现代理,因为Spring默认使用的就是默认使用的就是JDK Proxy,这符合,这符合Spring提倡面向接口编程的思想。提倡面向接口编程的思想。织入织入(Weaving):织入是指将切面应用到目标对象从而建立一个新的代理对象的过程,切:织入是指将切面应用到目标对象从而建立一个新的代理对象的过程,切面在指定的接入点被织入目标对象中,织入一般可发生在对象的编

5、译期,类装载期或运行面在指定的接入点被织入目标对象中,织入一般可发生在对象的编译期,类装载期或运行期,而期,而Spring的的AOP采用的是运行期织入。采用的是运行期织入。8.1.2 AOP的优点(1)代码集中。解决了由于代码集中。解决了由于OOP跨模块造成的代码纠跨模块造成的代码纠缠和代码分散问题。缠和代码分散问题。(2)模块化横切关注点。核心业务级关注点与横切关模块化横切关注点。核心业务级关注点与横切关注点分离开,降低横切模块与核心模块的耦合度,实注点分离开,降低横切模块与核心模块的耦合度,实现了软件工程中的高内聚、低耦合的要求。增强了程现了软件工程中的高内聚、低耦合的要求。增强了程序的可

6、读性,并且使系统更容易维护。序的可读性,并且使系统更容易维护。(3)系统容易扩展。系统容易扩展。AOP 的基本业务模块不知道横的基本业务模块不知道横切关注点的存在,很容易通过建立新的切面加入新的切关注点的存在,很容易通过建立新的切面加入新的功能。另外,当系统中加入新的模块时,已有的切面功能。另外,当系统中加入新的模块时,已有的切面自动横切进来,使系统易于扩展。自动横切进来,使系统易于扩展。(4)提高代码重用性。提高代码重用性。AOP把每个把每个Aspect实现为独实现为独立的模块,模块之间松散藕合,意味着更高的代码重立的模块,模块之间松散藕合,意味着更高的代码重用性。用性。8.1.3 Aspe

7、ctJ的切点表达式函数AspectJ的切点表达式由关键字和操作参的切点表达式由关键字和操作参数组成,例如,以下切点表达式:数组成,例如,以下切点表达式:execution(*chapter8.moniter.print(.)为了描述方便,不妨将为了描述方便,不妨将 execution()称作函称作函数,而将匹配串称作函数的入参。数,而将匹配串称作函数的入参。切入表达式中特殊符号切入表达式中特殊符号p.匹配除换行符外的任意单个字符匹配除换行符外的任意单个字符p*匹配任何类型的参数串匹配任何类型的参数串p.匹配任意的参数,匹配任意的参数,0到多个。到多个。Spring支持9个AspectJ切点表达

8、式函数,类别类别函数函数入参入参说明说明方法切方法切点函数点函数execution()execution()方法匹配模方法匹配模式串式串表示满足某一匹配模式的所有目标类方法连接点。表示满足某一匹配模式的所有目标类方法连接点。annotation()annotation()方法注解类方法注解类名名表示标注了特定注解的目标方法连接点。表示标注了特定注解的目标方法连接点。方法入方法入参切点参切点函数函数args()args()类名类名通过判别目标类方法运行时入参对象的类型定义指定连接点。通过判别目标类方法运行时入参对象的类型定义指定连接点。args()args()类型注解类类型注解类名名通过判别目标

9、方法的运行时入参对象的类是否标注特定注解来通过判别目标方法的运行时入参对象的类是否标注特定注解来指定连接点。指定连接点。目标类目标类切点函切点函数数within()within()类名匹配串类名匹配串限制在特定域下的所有连接点。如限制在特定域下的所有连接点。如within(ecjtu.service.within(ecjtu.service.*)表示表示ecjtu.serviceecjtu.service包中的所有连接点,即包中所有类的所有包中的所有连接点,即包中所有类的所有方法。方法。target()target()类名类名限制匹配的连接点其对应的被代理的目标对象为给定类型的实限制匹配的连接

10、点其对应的被代理的目标对象为给定类型的实例。例。within()within()类型注解类类型注解类名名如如 within(ecjtu.Monitor)within(ecjtu.Monitor)定义的切点,假如定义的切点,假如Y Y类标注了类标注了MonitorMonitor注解,则注解,则Y Y的所有连接点都匹配这个切点。的所有连接点都匹配这个切点。target()target()类型注解类类型注解类名名目标类标注了特定注解,则目标类所有连接点匹配该切点。目标类标注了特定注解,则目标类所有连接点匹配该切点。代理类代理类切点函切点函数数this()this()类名类名限制匹配的连接点其对应的限

11、制匹配的连接点其对应的Spring AOPSpring AOP代理代理BeanBean引用为给定类引用为给定类型的实例。型的实例。execution(*set*(.)表示执行任何以表示执行任何以set作为前缀的方法。作为前缀的方法。within(com.service.*)表示执行表示执行service包中的任何连接点的方法。包中的任何连接点的方法。this(com.service.AccountService)表示以表示以AccountService接口对接口对象作为代理的连接点在象作为代理的连接点在Spring AOP中执行。中执行。另外,另外,Spring AOP还提供了名为还提供了名为

12、bean切点指示符,用于指定切点指示符,用于指定Bean实实例的连接点。定义表达式时需要传入例的连接点。定义表达式时需要传入Bean的的id或或name。表达式参数允。表达式参数允许使用许使用“*”通配符。通配符。例如,例如,bean(*book)表示匹配所有名字以表示匹配所有名字以book结尾的结尾的Bean。要匹配要匹配Bean的某个方法可以通过的某个方法可以通过args参数进行指定。例如:参数进行指定。例如:Before(bean(sampleBean)&args()表示给表示给sampleBean所代表对象的所有无参方法执行前加入切面逻辑。所代表对象的所有无参方法执行前加入切面逻辑。8

13、.2 简单AOP应用示例1.配置文件配置文件2.业务逻辑接口【程序清单程序清单8-2】文件名为文件名为Sample.javapackage chapter8;public interface Sample public void some();public void other(String s)throws Exception;注意,为了让注意,为了让Spring自动利用自动利用JDK的代理功能的代理功能,定义定义接口有必要。用接口定义业务规范也是良好的程序设接口有必要。用接口定义业务规范也是良好的程序设计风格。计风格。3.业务逻辑实现【程序清单程序清单8-3】业务逻辑实现(文件名为业务逻辑

14、实现(文件名为work.java)package chapter8;public class work implements Samplepublic void some()System.out.println(do something.);public void other(String s)throws Exception System.out.println(s);throw new Exception(something is wrong.);4.切面逻辑package chapter8;import org.aspectj.lang.JoinPoint;import org.aspe

15、ctj.lang.annotation.*import org.springframework.stereotype.Component;AspectComponent /实现切面在实现切面在IOC容器中的注册容器中的注册public class Aspectlogic /*声明声明Before Advice,并直接指定切入点表达式,也就是,并直接指定切入点表达式,也就是chapter8包下包下work类的类的some方法作为切入点方法作为切入点,在该方法执行前执行切面逻辑,在该方法执行前执行切面逻辑*/Before(execution(*chapter8.work.some(.)public

16、 void execute()/切面逻辑的方法切面逻辑的方法 System.out.println(Before Method started excuting.);也可以先用也可以先用Pointcut定义切入点表达式,再将其应用到通知定义中,这样的好定义切入点表达式,再将其应用到通知定义中,这样的好处是一次定义,以后可多处使用,具体代码如下:处是一次定义,以后可多处使用,具体代码如下:public class Aspectlogic /定义切入点定义切入点Pointcut(execution(*chapter8.work.some(.)public void mypoint()/用来标注切入

17、点的方法必须是一个空方法用来标注切入点的方法必须是一个空方法/以下利用切入点定义以下利用切入点定义Before通知通知Before(mypoint()/也可写成也可写成:Before(pointcut=mypoint()public void execute()/切面逻辑的方法切面逻辑的方法 System.out.println(Before Method started excuting.);【输出结果】运行【输出结果】运行Tester应用程序,结果如下:应用程序,结果如下:Before Method started excuting.do something.hellohave Excep

18、tion!5.测试调用public class Tester public static void main(String args)ApplicationContext context=new ClassPathXmlApplicationContext(adviceContext.xml);Sample sample=(Sample)context.getBean(sampleBean);sample.some();try sample.other(hello);catch(Exception e)System.out.println(have Exception!);8.3 Spring

19、切面定义说明8.3.1 Spring的通知类型的通知类型Spring可定义可定义5类通知。它们是:类通知。它们是:Before通知通知 AfterReturning通知通知 AfterThrowing 通知通知 After通知通知 Around通知。通知。在同时定义了多个通知时,通知的执行次序与优先级有在同时定义了多个通知时,通知的执行次序与优先级有关,以下为通知优先级由低到高的顺序:关,以下为通知优先级由低到高的顺序:Before通知通知-Around通知通知-AfterReturning通知通知-After通知通知在定义在定义Around通知的切面逻辑方法时,必须给方法至少加入通知的切面逻

20、辑方法时,必须给方法至少加入ProceedingJoinPoint类型的参数,在方法内调用类型的参数,在方法内调用ProceedingJoinPoint的的proceed()方法才会执行目标方法。方法才会执行目标方法。调用调用ProceedingJoinPoint的的proceed()方法时,还可以传入一个方法时,还可以传入一个Object对对象,该数组中的数据将作为目标方法的实参。象,该数组中的数据将作为目标方法的实参。以下为具体举例以下为具体举例:Around(value=mypoint()public Object process(ProceedingJoinPoint pj)Objec

21、t res=null;try res=pj.proceed(new String新参数新参数);catch(Throwable e)e.printStackTrace();System.out.println(结果结果=+res);return res+更改更改;8.3.2 访问目标方法的参数访问目标方法最简单的做法是在定义通知时将第一访问目标方法最简单的做法是在定义通知时将第一个参数定义为个参数定义为JoinPoint类型的参数,该类型的参数,该JoinPoint参参数就代表了织入通知的连接点,数就代表了织入通知的连接点,JoinPoint内包含如下内包含如下常用方法,通过它们可传递信息:常

22、用方法,通过它们可传递信息:Object getArgs():返回执行目标方法时的参数;返回执行目标方法时的参数;Signature getSignature():返回切面逻辑方法的相返回切面逻辑方法的相关信息;关信息;Object getTarget():返回被织入切面逻辑的目标对返回被织入切面逻辑的目标对象;象;Object getThis():返回返回AOP框架为目标对象生成的代框架为目标对象生成的代理对象。理对象。获取目标方法的相关信息After(mypoint()public void execute2(JoinPoint jp)System.out.println(After 切入

23、点的操作信息:切入点的操作信息:+jp.getTarget()+n方法调用参数:方法调用参数:+jp.getArgs()+n当前代理对象:当前代理对象:+jp.getThis()+n方法的签名:方法的签名:+jp.getSignature().getName();【输出结果输出结果】After 切入点的操作信息:切入点的操作信息:chapter8.work888e6c方法调用参数:方法调用参数:Ljava.lang.Object;100363当前代理对象:当前代理对象:chapter8.work888e6c方法的签名:方法的签名:some关于args方法Spring还可以通过通知定义中的还可以

24、通过通知定义中的args方法来获取目方法来获取目标方法的参数。如果在一个标方法的参数。如果在一个args表达式中指定了一个表达式中指定了一个或多个参数,则该切入点将只匹配具有对应形参的方法。或多个参数,则该切入点将只匹配具有对应形参的方法。以下的通知定义中,由于切入点的以下的通知定义中,由于切入点的some方法是一方法是一个无参方法,和通知的定义不能匹配,所以下面的切面个无参方法,和通知的定义不能匹配,所以下面的切面逻辑不会被执行。逻辑不会被执行。After(mypoint()&args(str)public void AfterAdviceWithArg(String str)System.out.println(after advice with arg is executed!arg is:+str);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《Spring编程技术与应用》课件8.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|