package org.amigo.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 日志拦截器,用来进行日志处理.
* @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
* Creation date: 2007-10-7 - 上午09:31:44
*/
public class LogInterceptor implements InvocationHandler {
private Object delegate;
/**
* 构造函数,设置代理对象.
*/
public LogInterceptor(Object delegate){
this.delegate = delegate;
}
/**
* 方法的调用.
* @param proxy
* @param method 对应的方法
* @param args 方法的参信息
* @return 返回操作结果对象
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
System.out.println("before process" + method);
//调用代理对象delegate的method方法,并将args作为参数信息传入
result = method.invoke(delegate, args);
System.out.println("after process" + method);
} catch (Exception e){
System.err.println("发生异常:" + e.toString());
}
return result;
}
/**
* 测试方法.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BusinessObj obj = new BusinessObjImpl();
//创建一个日志拦截器
LogInterceptor interceptor = new LogInterceptor(obj);
//通过Proxy类的newProxyInstance(...)方法来获得动态的代理对象
BusinessObj proxy = (BusinessObj) Proxy.newProxyInstance(
BusinessObjImpl.class.getClassLoader(),
BusinessObjImpl.class.getInterfaces(),
interceptor);
//执行动态代理对象的业务逻辑方法
proxy.process();
}
}
此时还需要对BusinessObj的实现类BusinessObjImpl类进行修改,去掉其日志记录等内容,修改后的文件如下:
package org.amigo.proxy;
/**
* 业务逻辑对象实现类.
* @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
* Creation date: 2007-10-7 - 上午09:11:49
*/
public class BusinessObjImpl implements BusinessObj {
/**
* 执行业务.
*/
public void process() {
System.out.println("执行业务逻辑");
}
}
运行LogInterceptor类我们可以发现,它实现了前面所需要的功能,但是很好的将业务逻辑方法的代码和日志记录的代码分离开来,并且所有的业务处理对象都可以利用该类来完成日志的记录,防止了重复代码的出现,增加了程序的可扩展性和可维护性,从而提高了代码的质量。那么Spring中的AOP的实现是怎么样的呢?接着让我们来对Spring的AOP进行探讨,了解其内部实现原理。