SpringAOP使日志输出与方法分离

来源:互联网 发布:字典转化为csv python 编辑:程序博客网 时间:2024/04/30 09:02

对方法进行日志输出是一种很常见的基本功能。传统的做法是把输出语句卸载方法体的内部,在调用该方法的时候,用输出语句输出信息来记录方法的执行。AOP可以分离与业务无关的代码,日志输出与方法都做些什么是无关的,其主要目的是记录方法被执行过。下面是一个Demo,利用SpringAOP使日志输出与方法分离,使得在调用模板方法之前执行日志输出。如图所示:

(1)创建Target类,作为被代理的目标对象。其中有一个execute()方法,现在使用AOP对execute()方法做日志输出。执行execute()方法之前,做日志输出。

<span style="font-size:14px;">package testDomain;public class Target {public void  execute(String name){System.out.println("执行execute()方法: " + name); //输出信息}}</span>
(2)创建LoggerExecute类,用于通知可以拦截目标对象的execute()方法,并执行日志输出。

<span style="font-size:14px;">package testDomain;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import com.opensymphony.xwork2.interceptor.annotations.Before;public class LoggerExecute implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {before();invocation.proceed();return null;}public void before(){System.out.println("程序开始执行");}}</span>

实现MethodInterceptor 接口,在调用目标对象的方法时,就可以实现在调用方法之前、调用方法过程中、调用方法之后对其进行控制。invocation.proceed()的proceed()是执行目标对象的execute()方法。

 (3)创建Manager类,在该类的方法中创建目标对象、创建代理、代理执行execute()方法。代码:

<span style="font-size:14px;">package testDomain;import org.springframework.aop.framework.ProxyFactory;public class Manager {public static void main(String[] args) {Target target =new Target();  //创建目标对象ProxyFactory di= new ProxyFactory();  //创建代理di.addAdvice(new LoggerExecute());di.setTarget(target);Target proxy =(Target)di.getProxy();proxy.execute("这是AOP的简单实现");}}</span>
这里ProxyFactory可以创建代理,其中setTarget()方法可以设置目标对象,addAdvice()方法向这个目标添加了一个通知,这个通知会应用到目标对象的所有方法上去,随后通过调用ProxyFactory实例的GetProxy()方法获得一个代理——也就是目标对象AOP代理。当调用代理的Execute方法时。通知就被“应用了”(或者说被执行了)。
这样通过AOP来实现,可以将想似的代码统一起来,方便以后修改。同时AOP是可插拔式的,如果想去掉可以直接去掉即可。

0 0
原创粉丝点击