码迷,mamicode.com
首页 > 编程语言 > 详细

spring AOP 环绕增强小Demo

时间:2015-05-23 12:59:53      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:spring   aop   环绕增强   methodinterceptor   


    前面写了一个前置增强,后置增强的小demo,前置增强即在方法调用前对方法增强;后置增强即在方法调用后对方法增强。环绕增强允许在目标类方法调用前后织入横切逻辑,它综合了前置、后置增强两者的功能。


    还继续沿用之前的代码,这里介绍环绕增强的实现类和测试类。


环绕增强类 GreetingAroundAdvice.java 


package com.paic.zhangqi.spring.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class GreetingAroundAdvice implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		
		// 获取目标方法入参
		Object[] args = invocation.getArguments();
		String clientName = (String)args[0];
		
		// 目标方法调用前执行
		System.out.println("How are you!Mr."+clientName+".");
		
		// 通过反射机制调用目标方法
		Object obj = invocation.proceed();
		
		// 目标方法调用后执行
		System.out.println("Please enjoy yourself!");
		
		return obj;
	}

}


    环绕增强的代码和前面前置增强代码有一个不同处,所实现的接口包路径改变了。前置增强、后置增强实现的接口在org.springframework.aop 路径下,而环绕增强类需要实现org.aopalliance.intercept.MethodInterceptor

接口。这个接口不是 Spring 提供的,它是 AOP 联盟写的,Spring 只是借用了它。该接口拥有唯一的接口方法Object invoke(MethodInvocation invocation) throws Throwable ,MethodInvocation 不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象,通过MethodInvocation 的 getArguments() 方法可以获取目标方法的入参数组,通过proceed() 反射调用目标实例相应的方法。通过在实现类中定义横切逻辑,很容易实现方法的前后置的增强。



测试类 TestAdvice.java

package com.paic.zhangqi.spring.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.framework.ProxyFactory;

public class TestAdvice {

	public static void main(String[] args) {
		
		Waiter target = new NaiveWaiter();
		
		// 环绕增强类
		MethodInterceptor aroundAdvice = new GreetingAroundAdvice();
		
		// spring 提供的代理工厂
		ProxyFactory pf = new ProxyFactory();
		
		// 设置代理目标
		pf.setTarget(target);
		
		// 为代理目标添加增强
		pf.addAdvice(aroundAdvice);
		
		// 生成代理实例
		Waiter proxy = (Waiter)pf.getProxy();
		
		proxy.greetTo("John");
		proxy.serveTo("Tomcat");

	}
}

输出结果

log4j:WARN No appenders could be found for logger (org.springframework.aop.framework.CglibAopProxy).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
How are you!Mr.John.
greet to John...
Please enjoy yourself!
How are you!Mr.Tomcat.
serving Tomcat...
Please enjoy yourself!




spring AOP 环绕增强小Demo

标签:spring   aop   环绕增强   methodinterceptor   

原文地址:http://blog.csdn.net/magi1201/article/details/45933095

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!