您的位置:首页 > 编程语言 > Java开发

Spring——AOP的相关通知及应用

2016-07-06 23:52 441 查看
    有关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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0 aop 通知 异常