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

下载本文档

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

文档简介

第二章Spring面向切面编程回顾Spring的5大主要模块是IoC、AOP、测试框架、Web及远程操作和数据库访问集成。控制反转(InversionofControl,英文缩写为IoC)是Spring容器的内核。Spring的核心配置文件是applicationContext.xml。在Property属性中,ref属性用于解决对其他类依赖的问题。在Property属性中,可以将java.util包中的集合类型注入到BeanFactory。本章内容1AOP基本概念和术语2正则表达式匹配切面3前置增强1使用Spring的前置和后置增强2使用正则表达式方式匹配切面使用AOP实现“网络摄像头”实践练习AOP概念AOP的专业术语增强类型介绍使用AOP完成后置增强技术讲解讲解时间:45分钟实践时间:45分钟2.1

AOP基本概念和术语:内容预览2.1.1AOP概念AOP是AspectOrientedProgramming的缩写,意思是面向切面编程(亦称为面向方面)。它可以解决程序中的共性问题。

2.1.2

AOP的术语解释AOP的关键术语切面(Aspect)增强(Advice)连接点(Joinpoint)切入点(Pointcut)目标对象(Target)代理对象(Proxy)织入(Weaving)AOP为增强定义了org.asoalliance.Advice接口,Spring支持5种类型的增强:BeforeAdvice:前置增强,表示在目标方法执行前实施增强。AfterReturningAdvice:后置增强,表示在目标方法执行后实施增强。MethodInterceptor:环绕增强,表示在目标方法执行前后实施增强。ThrowsAdvice:抛出异常增强,表示在目标方法抛出异常后实施增强。IntroductionInterceptor:引介增强,表示在目标类中添加一些新的方法和属性。2.1.3增强类型介绍案例说明某日,苹果公司正在进行每年一次的调查问卷活动,调查的目的是统计iPadmini消费者的年龄和性别,收营员会让购买iPadmini的顾客填写一张调查问卷,作为激励措施,收营员会送给填写问卷的顾客一张贴膜。实现步骤创建目标类和后置增强类;在applicationContext.xml文件中对目标类和后置增强类进行注入,并且代理;在测试类中调用代理对象,查看控制台的输出结果。使用AOP完成后置增强2.1.4使用AOP完成后置增强1.创建Web工程,添加Spring支持。选择Spring对AOP的支持。添加Spring

AOP支持2.1.4使用AOP完成后置增强ICustomer.javapublicinterfaceICustomer{ publicvoidbuyIpadMini();}

Customer.javapublicclassCustomerimplementsICustomer{ publicvoidbuyIpadMini(){ System.out.println("购买了一台iPadmini"); }}创建客户类接口,即目标对象的接口创建客户类。实现ICustomer接口和接口中定义的方法SurveyAfterAdvice.javapublicclassSurveyAfterAdviceimplementsAfterReturningAdvice{

publicvoidafterReturning(ObjectreturnObj,Methodmethod,Object[]args,Objectobj)throwsThrowable{System.out.println("帮助Apple公司完成问卷,送给客户一张贴膜!");}}实现后置增强,该类实现AfterReturningAdvice接口和接口中定义的方法2.1.4使用AOP完成后置增强2.创建目标类和后置增强类。applicationContext.xml<!--注入后置增强--> <beanid="surveyAfterAdvice"class="com.mstf.advice.SurveyAfterAdvice"/>

<!--注入目标对象--><beanid="target"class="com.mstf.bean.Customer"/>

<!--定义代理对象--><beanid="customerBean"class="org.springframework.aop.framework.ProxyFactoryBean"p:proxyInterfaces="com.mstf.bean.ICustomer"p:target-ref="target" p:interceptorNames="surveyAfterAdvice"/>注入后置增强注入目标对象定义代理对象2.1.4使用AOP完成后置增强3.在applicationContext.xml文件中对目标类和后置增强类进行注入,并且代理。2.1.5学生实践练习通过对AOP的理解,完成目标对象后置增强。模拟员工在上班期间,网络摄像头监控员工行为的案例。员工在上班时的任何行为都会被摄像头捕捉,当每个行为发生后,系统会自动提示。实践时间:45分钟2.1.5学生实践练习在bean包中,创建目标对象IEmployee的接口,定义一个work()方法。在bean包中,创建目标对象Employee类,并实现接口中的方法,在work()方法中输出一句话“员工在工作中!”。在advice包中,创建一个Camera(摄像头)后置增强类,并实现AfterReturningAdvice接口,在实现方法中输出一句话“摄像头已经记录用户行为!”。在applicationContext.xml文件中,依次注入目标对象、后置增强和代理。在测试类中,获得employeeBean代理对象,调用work()方法。执行测试,查看输出结果。通过“网络摄像头”捕捉

员工的游戏行为实践练习使用正则表达式方式匹配

切面技术讲解讲解时间:20分钟实践时间:25分钟2.2正则表达式匹配切面:内容预览2.2.1

使用正则表达式方式匹配切面可以使用正则表达式进行描述匹配,RegexpMethodPointcutAdvisor是该切面的实现。例如,使用“buyIpad.*”匹配所有以buyIpad开头的方法。假设,目标对象中有多个方法,在执行中,我们要让某几个方法在执行时才获得增强,那又该如何实现呢?publicvoidbuyIphone()publicvoidbuyIpadMini()不允许buyIphone方法获得增强ref属性的使用2.2.1

使用正则表达式方式匹配切面Customer.javapublicclassCustomerimplementsICustomer{ publicvoidbuyIphone(){ System.out.println("购买了一台iPhoneX"); }

publicvoidbuyIpadMini(){ System.out.println("购买了一台iPadmini"); }}增加一个购买iPhone的方法applicationContext.xml<!--正则表达式方式匹配切面的切面实现类--> <beanid="surveyRegexpAdvice"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"p:advice-ref="surveyAfterAdvice"><!--.*代表匹配换行符以外的0~N个字符--> <propertyname="pattern"value=".*IpadMini.*"></property></bean>定义切面表达式2.2.1

使用正则表达式方式匹配切面如果在目标对象中添加一个seeSee方法。在seeSee()和buyIpadMini()方法穿过切面时,获得后置增强,应该怎么定义表达式呢?<!--patterns:匹配多个表达式--><propertyname="patterns"><list>

<value>.*IpadMini.*</value> <value>.*see.*</value></list></property>2.2.2学生实践练习实践时间:25分钟使用上一节的案例,结合正则表达式匹配切面的方式,对目标连接点进行拦截。摄像头发现员工玩游戏时,网络摄像头记录员工行为。摄像头发现员工在工作时,则不被摄像头记录员工行为。2.2.2学生实践练习在工程中,创建名为Car的类修改IEmployee接口,定义qqGame()、lolGame()方法。修改Employee类,实现接口中的方法。

在applicationContext.xml,添加正则表达式切面,对带有“Game”的方法名进行文件中拦截。

在applicationContext.xml文件中,修改代理对象p:interceptorNames的织入。

在测试类中,调用work、qqGame和lolGame方法,查看控制台的正确输出。增设一个“摄像头”对员工

行为“预警提示”实践练习使用AOP完成前置增强技术讲解讲解时间:20分钟实践时间:25分钟2.3前置增强:内容预览2.3.1使用AOP完成前置增强使用AOP完成前置增强案例说明在顾客购买前先提供身份证信息,如果为武汉市居民身份证,则在购买前先送一张100元代金券,并提示客户。实现步骤修改buyIpadMini方法,为其添加一个参数,接收顾客的证件号码。在工程中创建前置通知。在applicationContext.xml文件中注入前置通知。在控制台输出结果。2.3.1使用AOP完成前置增强ICustomer.javapublicinterfaceICustomer{ publicvoidbuyIpadMini(StringcusId);}修改buyIpadMini方法,提供顾客身份证信息BuyBeforeAdvice.javapublicclassBuyBeforeAdviceimplementsMethodBeforeAdvice{publicvoidbefore(Methodmethod,Object[]args,Objectobj) throwsThrowable{ //System.out.println("当前正在执行"+obj.getClass().getName()+"类。"); //System.out.println("当前正在执行"+method+"方法。"); //获得方法的第一个参数 StringcardId=args[0].toString(); if(cardId.indexOf("420107")==0){ System.out.println("敬爱的顾客,您手持的是武汉市居民身份证,Apple公司将赠送您一张100元代金券!"); } }}常见集合属性,并初始化获得buyIpadMini方法的参数1.修改buyIpadMini方法,为其添加一个参数,接收顾客的证件号码。2.在工程中创建前置通知。2.3.1使用AOP完成前置增强applicationContext.xml<!--注入前置增强--><beanid="buyBeforeAdvice"class="com.mstf.advice.BuyBeforeAdvice"/>

<!--修改代理对象配置中p:interceptorNames的织入--><beanid="customerBean"class="org.springframework.aop.framework.ProxyFactoryBean" p:proxyInterfaces="com.mstf.bean.ICustomer"p:target-ref="target" p:interceptorNames="surveyAfterAdvice,buyBeforeAdvice"/>可以添加多个增强类型TestMain.javapublicclassTestMain{publicstaticvoidmain(String[]args){ ApplicationContextcontext=newClassPathXmlApplicationContext( "applicationContext.xml"); ICustomercus=(ICustomer)context.getBean("customerBean"); cus.buyIpadMini(); System.out.println("---------------------------------"); cus.buyIpadMini(); }}传递测试参数,以“420107”开头表示“湖北省武汉市”编号3.在applicationContext.xml文件中注入前置通知。并在控制台输出结果。2.3.2学生实践练习实践时间:25分钟使用本章2.2.2小节的案例,结合前置增强对目标连接点进行拦截。在公司增设了一台摄像头,主要功能是对员工上班行为的预警,对员工的每一个行为进行警告。2.3.2学生实践练习在工程中,创建一个BeforeCamera(前置摄像头)前

温馨提示

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

评论

0/150

提交评论