Spring——AOP的相关通知及应用
2016-07-06 23:52
441 查看
有关AOP的概念理解,在前边写过一篇博文“从静态代理到动态代理理解AOP”可以参考理解,在这篇博文中主要说明一下在AOP中的相关概念和一系列通知,及其在实际开发中的应用。
一、什么是通知?
现在举个例子,说明一下什么是通知。为了容易理解,通过动态代理的相关代码,站在AOP思想的角度说明一下吧。
模拟事务处理类的相关代码
动态代理中的代码处理
其中在代码中目标方法method.invoke方法前后分别进行了事务的相关处理。这些在目标方法前后切入的方法就称为“通知”,在目标方法前切入的为“前置通知”,在目标方法后边切入的为“后置通知”。其中还有一个概念就是“切面”,其中事务类就是一个切面,通知是切面中的方法。下边对相关通知及其使用方法进行说明。
二、相关通知
1、前置通知
前置通知配置后,方法会在目标方法执行之前执行,其执行方法代码和在spring配置文件的AOP配置信息如下:
方法代码
配置代码
其中method为配置的方法名,pointcut-ref为配置的切入点,需要注意的是,通知是切面中的方法。
2、后置通知
后置通知为在目标方法执行之后执行的方法。后置通知有个特点是可以获取目标方法的返回值,而且目标方法发生异常,后置通知将不再会执行。代码参考下面
方法代码
配置代码
其中returning="",就是获取目标方法返回值的配置。
3、异常通知
配置异常通知,可以处理在代码执行过程中所抛出的异常。其相关配置如下:
方法代码
4、最终通知
顾名思义可以明白,配置了该通知的方法会在最后执行,配置如下。
方法代码
配置代码
5、环绕通知
环绕通知可以控制目标方法的执行,先看一下其配置
方法代码
配置方法
环绕通知在执行本身方法代码之后,再通过调用joinPoint的proceed方法调用目标方法,如果将joinPoint.procced()方法去掉,就可以控制使目标方法不执行。
三、异常处理应用
我们可以通过如下方式对异常进行处理:
首先,将Dao层的异常都向上抛,统一在service层进行接受和处理,Spring容器管理着各层的Demo对象;创建一个异常处理类,作为处理异常的切面。在配置的过程中需要注意的是,需要将Service层配置为切入点,同时配置异常通知。
异常处理方法代码
配置代码
一、什么是通知?
现在举个例子,说明一下什么是通知。为了容易理解,通过动态代理的相关代码,站在AOP思想的角度说明一下吧。
模拟事务处理类的相关代码
public class Transaction { public void beginTransaction(){ System.out.println("begin transaction"); } public void commit(){ System.out.println("commit"); } }
动态代理中的代码处理
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("savePerson") ||method.getName().equals("updatePerson")){ this.transaction.beginTransaction(); method.invoke(this.target, args);//调用目标类的目标方法 this.transaction.commit(); }else{ method.invoke(this.target, args);//调用目标类的目标方法 } return null; }
其中在代码中目标方法method.invoke方法前后分别进行了事务的相关处理。这些在目标方法前后切入的方法就称为“通知”,在目标方法前切入的为“前置通知”,在目标方法后边切入的为“后置通知”。其中还有一个概念就是“切面”,其中事务类就是一个切面,通知是切面中的方法。下边对相关通知及其使用方法进行说明。
二、相关通知
1、前置通知
前置通知配置后,方法会在目标方法执行之前执行,其执行方法代码和在spring配置文件的AOP配置信息如下:
方法代码
/** * 前置通知,在目标方法执行前执行 */ public void beginTransaction(JoinPoint joinPoint){ System.out.println("begin transaction"); }
配置代码
<!--前置通知,在目标方法执行之前--> <aop:before method="beginTransaction" pointcut-ref="perform"/>
其中method为配置的方法名,pointcut-ref为配置的切入点,需要注意的是,通知是切面中的方法。
2、后置通知
后置通知为在目标方法执行之后执行的方法。后置通知有个特点是可以获取目标方法的返回值,而且目标方法发生异常,后置通知将不再会执行。代码参考下面
方法代码
/** * 后置通知,在目标方法执行之后执行 */ public void commit(JoinPoint joinPoint,Object val){ System.out.println("返回值:"+val); System.out.println("commit"); }
配置代码
<!-- 后置通知 1、在目标方法执行之后 2、能够获取目标方法的返回值returning="val" 3、如果目标方法产生异常,则后置通知不再执行 --> <aop:after-returning method="commit" pointcut-ref="perform" returning="val"/>
其中returning="",就是获取目标方法返回值的配置。
3、异常通知
配置异常通知,可以处理在代码执行过程中所抛出的异常。其相关配置如下:
方法代码
/** * 异常通知,处理下边抛出的异常 */ public void throwingMethod(JoinPoint joinPoint,Throwable ex){ System.out.println(ex.getMessage()); }配置代码
<!--异常通知,获取目标方法抛出的异常信息--> <aop:after-throwing method="throwingMethod" pointcut-ref="perform" throwing="ex"/>
4、最终通知
顾名思义可以明白,配置了该通知的方法会在最后执行,配置如下。
方法代码
/** * 最终通知 */ public void finallyMethod(){ System.out.println("finally method"); }
配置代码
<!--最终通知--> <aop:after method="finallyMethod" pointcut-ref="perform"/>
5、环绕通知
环绕通知可以控制目标方法的执行,先看一下其配置
方法代码
/** * 环绕通知 */ public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("around method"); return joinPoint.proceed();//执行目标方法 }
配置方法
<!-- 环绕通知能够控制目标方法的执行--> <aop:around method="aroundMethod" pointcut-ref="perform"/>
环绕通知在执行本身方法代码之后,再通过调用joinPoint的proceed方法调用目标方法,如果将joinPoint.procced()方法去掉,就可以控制使目标方法不执行。
三、异常处理应用
我们可以通过如下方式对异常进行处理:
首先,将Dao层的异常都向上抛,统一在service层进行接受和处理,Spring容器管理着各层的Demo对象;创建一个异常处理类,作为处理异常的切面。在配置的过程中需要注意的是,需要将Service层配置为切入点,同时配置异常通知。
异常处理方法代码
/** * 在该方法中对异常进行处理 * @param ex */ public void exceptionAdvice(Throwable ex){ System.out.println(ex.getMessage()); }
配置代码
<aop:config> <aop:pointcut expression="execution(* com.rcj.spring.aop.service.impl.*.*(..))" id="perform"/> <aop:aspect ref="exceptionAspect"> <!--配置异常通知--> <aop:after-throwing method="exceptionAdvice" pointcut-ref="perform" throwing="ex"/> </aop:aspect> </aop:config>
相关文章推荐
- Spring AOP动态代理-切面
- Ruby中的异常处理代码编写示例
- yui3的AOP(面向切面编程)和OOP(面向对象编程)
- SQL Server 2005 中使用 Try Catch 处理异常
- MySQL抛出Incorrect string value异常分析
- 浅谈C#中简单的异常引发与处理操作
- JavaScript AOP编程实例
- 详解C#编程中异常的创建和引发以及异常处理
- 使用AOP改善javascript代码
- 初识SmartJS - AOP三剑客
- 详解JavaScript中的异常处理方法
- java程序中的延时加载异常及解决方案
- 解析Java异常的栈轨迹及其相关方法
- .NET(C#):Emit创建异常处理的方法
- windows7服务器上weblogic启动失败异常解决方法
- 有关ajax的error与后台的异常问题解决
- 深入探讨JAVA中的异常与错误处理
- java使用动态代理来实现AOP(日志记录)的实例代码
- Python3 错误和异常