ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:34.11KB ,
资源ID:16970630      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-16970630.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring的AOP模块.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

Spring的AOP模块.docx

1、Spring的AOP模块第3章 Spring的AOP模块本章学习目的和要求本章重点和难点AOP是Spring框架的另一个重要特征。AOP(Aspect Oriented Programming,面向切面编程)把一个业务流程分成几部分,例如权限检查、业务处理、日志记录,每个部分单独处理,然后把它们组装成完整的业务流程。每个部分被称为切面(Aspect)或者关注点。3.1 实例:使用拦截器拦截方法(在struts-2.3.8中复制commons-logging-1.1.1、aopalliance-1.0.jar)AOP有一些重要的概念,包括切面(Aspect)、连接点(Joinpoint)、通知(

2、Advice)、切入点(Pointcut)、引用(Introduction)等。这些概念并不是Spring定义的。对于刚刚接触AOP的开发者来说,这些概念非常抽象,往往很难理解。抛开这些抽象的概念,先来看一个AOP例子。前面的章节中曾介绍了一个AOP的例子。下面看一下稍微复杂的例子。本例中,AOP的规则要稍微复杂一些。3.1.1 Service接口Spring推荐使用接口编程。该接口定义了两个方法。一会儿将使用拦截器拦截其中的withAop()方法,而另一个方法withoutAop()将不会被拦截。IAopService.javapackage com.helloweenvsfei.sprin

3、g.aop;public interface IAopService /Service接口,定义两个方法 public void withAop() throws Exception; /将会被拦截 public void withoutAop() throws Exception; /不会被拦截3.1.2 Service实现代码IAopService实现类中定义了一个name属性,以及对应的getter、setter方法。实现类代码为:AopServiceImpl.javapackage com.helloweenvsfei.spring.aop;import javax.security.

4、auth.login.AccountException;public class AopServiceImpl implements IAopService /Service实现 private String name; /name属性 public void withAop() throws Exception /withAop方法实现 System.out.println(有AOP的函数运行。name: +name); if (name.trim().length()=0) / 如果name为空 throw new AccountException(name属性不能为空); / 则抛出异常

5、 public void withoutAop() throws Exception / withoutAop方法实现 System.out.println(没有AOP的函数运行。); public String getName() /getter方法 return name; public void setName(String name) /setter方法 this.name=name; 3.1.3 方法前拦截器检查name是否为null下面是方法前拦截器,实现自MethodBeforeAdvice接口。方法前拦截器在执行指定方法前被调用,参数分别为被调用的方法、执行时被传入的参数、被拦

6、截的Bean。代码为:MethodBeforeInterceptor.javapackage com.helloweenvsfei.spring.aop;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class MethodBeforeInterceptor implements MethodBeforeAdvice /方法前拦截器 / 调用对象的方法前将执行该方法。参数分别为被调用的方法、被调用调用方法的参数、对象 public void before(Meth

7、od method, Object args, Object instance) throws Throwable System.out.println(即将要执行方法: + method.getName(); / 打印控制台 if(instance instanceof AopServiceImpl) /如果是Service String name=(AopServiceImpl) instance).getName(); / 获取name if(name=null) / 检查是否为空 throw new NullPointerException(name属性不能为null); 3.1.4

8、返回后拦截器输出返回值返回后拦截器,实现自AfterReturningAdvice接口。返回后拦截器在执行完指定方法、并返回之后被调用。如果有返回值,可以取到返回值,否则为null。参数分别为方法返回值、被调用的方法、执行时被传入的参数、被拦截的Bean。代码为:MethodAfterInterceptor.javapackage com.helloweenvsfei.spring.aop;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class Method

9、AfterInterceptor implements AfterReturningAdvice /方法后拦截器 public void afterReturning(Object value, Method method, Object args,Object instance) throws Throwable System.out.println(方法+method.getName()+运行完毕,返回值为:+value); 3.1.5 异常拦截器捕获异常异常抛出拦截器,实现自ThrowsAdvice接口。如果指定的方法中有异常被抛出,被调用。与上两个拦截器接口不同,ThrowsAdvic

10、e接口没有定义任何方法,因此不需要实现任何方法。但是如果定义了形如afterThrowing(Method,args,target,subclassOfThrowable)的方法,这些方法将会被调用。参数分别为:被调用的方法、方法的参数、被拦截的Bean以及抛出的异常类。这里面只有最后一个参数是必须的。Spring之所以这样设计,是为了是开发者灵活的定义多个方法捕捉不同的异常。代码为:package com.helloweenvsfei.spring.aop;import java.lang.reflect.Method; import javax.security.auth.login.Ac

11、countException;import org.springframework.aop.ThrowsAdvice;public class ThrowsInterceptor implements ThrowsAdvice /异常拦截器 public void afterThrowing(Method method, Object args, Object instance,AccountException ex) throws Throwable System.out.println(方法+method.getName()+ 抛出了异常:+ex); public void afterTh

12、rowing(NullPointerException ex) throws Throwable System.out.println(抛出了异常: + ex); 3.1.6 拦截器配置然后把三个拦截器连同Service实现类配置到Spring中。Spring将实例化三个拦截器对象、一个Service对象,并安装指定的规则装配。配置代码为:ApplicationContext.xml aopMethodBeforeInterceptor aopMethodAfterInterceptor aopThrowsInterceptor 3.1.7 运行代码运行代码从Spring容器中获取Servic

13、e对象,并分别执行Service的两个方法withAop()与withoutAop()。Spring将会在withAop()方法前后添加拦截器,但withoutAop()方法前后不会。代码为:AopRun.javapackage com.helloweenvsfei.spring.aop;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.ClassPathResource;public class AopRun public static void mai

14、n(String args) throws Exception XmlBeanFactory factory = new XmlBeanFactory( /获取Factory new ClassPathResource( applicationContext.xml); IAopService hello = (IAopService) factory.getBean(aopService); / 查找对象 hello.withAop(); / 执行withAop() hello.withoutAop(); / 执行withoutAop() factory.destroySingletons(

15、); / 销毁对象 运行效果如图3.1。图3.1 拦截器运行效果在本例中,由于没有异常抛出,因此ThrowsInterceptor没有起作用。读者可以在xml中设置name属性为null或者空字符串,使withAop()方法中抛出异常,观察运行效果。3.2 拦截器与Filter的区别Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:3.2.1 使用范围不同Filter是Servlet规范规定的,只能用于Web程序中。而拦截器即可以用于Web程序,也可以用于Application、Swing程序中。3.2.2

16、规范不同Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。3.2.3 使用的资源不同同其它的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。3.2.4 深度不同Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。因此在Spring构架的程序中,要优先使用拦截器。3.3

17、AOP的相关概念看一下面向切面的编程的几个常用的概念:切面Aspect、通知Advisor与切入点Pointcut。3.3.1 切面Aspect在本例中,方法withAop()、withoutAop()中都有一些代码。虽然只是一些输出语句,但是在真实的程序中这里应该是一些有意义的代码(如读写数据库、权限检查、异常情况记录等)。这些代码可以看作是AOP中的切面(Aspect)。可以将切面理解为模块。3.2.2 通知Advisor本例的三个拦截器都是实现自某个Advisor接口。从类名上看就知道三个拦截器都是AOP中的通知(Advisor)。一旦Spring符合条件,就会派发出通知。与生活中的通知

18、不同的地方在于,Spring中的通知是带有执行代码的,实现某种功能。3.3.3 切入点Pointcut在配置拦截器的时候,xml中只配置了withAop()方法使用拦截器,而withoutAop()方法没有配置拦截器。这种配置是借助于org.springframework.aop.support.NameMatchMethodPointcutAdvisor完成的。从类名称上看,这是一个切入点(Pointcut)。该类对象能配置对哪些方法使用拦截器,从哪个地方“切入”进去。配置时可以使用通配符。该类名上也带有Advisor是因为它是用通知(Advisor)实现的。简单地说,“切入点”负责往“什么

19、地方”插入代码,而“通知”负责插入“什么代码”。3.3.4 切入点配置方式Spring提供灵活的切入点配置方式。例如使用正则表达式。下面是Spring官方的一个使用正则表达式的例子。Spring接受Perl 5支持的正则表达式: .*get.* .*absquatulate 3.4 AOP的代理模式代理模式是Spring中常用的设计模式。Spring提供了几个常用的代理类,例如普通的代理类、事务代理类等等。3.4.1 ProxyFactoryBean代理工厂对象上例配置AopServiceImpl时使用了org.springframework.aop.framework.ProxyFactor

20、yBean类。这是Spring内置的代理类,引入了一个中间层,能够创建不同类型的对象。利用它可以实现任何形式的AOP。3.4.2 TransactionProxyFactoryBean事务代理工厂对象另一个很有用的代理类是TransactionProxyFactoryBean,是ProxyFactoryBean的子类,常用在数据库编程上。Spring利用TransactionProxyFactoryBean对事务进行管理,在指定方法前利用AOP连接数据库并开启事务,然后在指定方法返回后利用AOP提交事务并断开数据库。例如Spring宠物商店里的事务性配置: PROPAGATION_REQUIREDpropagetion PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly 事务管理配置详见本章后面的DAO模块与ORM模块。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2