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的相关通知及应用的主要内容,如果未能解决你的问题,请参考以下文章

Spring-aop实现切面的四种方式

Spring AOP 应用:三种配置及实现方式

Spring之AOP理解及使用

Spring基础知识之基于注解的AOP

全网最全最热门的Spring AOP面试题及答案。

Spring AOP前置通知实例说明AOP相关概念