Spring——AOP的相关通知及应用
Posted 任长江
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——AOP的相关通知及应用相关的知识,希望对你有一定的参考价值。
有关AOP的概念理解,在前边写过一篇博文“从静态代理到动态代理理解AOP”可以参考理解,在这篇博文中主要说明一下在AOP中的相关概念和一系列通知,及其在实际开发中的应用。
一、什么是通知?
现在举个例子,说明一下什么是通知。为了容易理解,通过动态代理的相关代码,站在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的相关通知及应用的主要内容,如果未能解决你的问题,请参考以下文章