JDK动态代理
2016-07-21 本文已影响26人
焱J
JDK动态代理
2016年7月21日 9:55
@Janyd
背景
Spring AOP是一种面向切面编程,通常运用在日志管理和事务管理较多。但是其中的实现原理是什么呢?AOP采用的是JDK动态代理或者是CGLIB代理。在此讲解JDK动态代理。
实现原理
其实JDK动态代理就是实现InvocationHandler接口,这里使用了代理模式,将目标对象封装起来并在执行方法前后加入切面操作即可达到AOP切面编程了。代码如下:
public class CustomInvocationHandler implements InvocationHandler {
//目标对象
Object target;
//通过构造函数给目标对象赋值
public CustomInvocationHandler(Object target) {
this.target = target;
}
//该函数是实现接口方法,核心的所在
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//目标对象执行方法前代码
System.out.println("开始时间:" + System.currentTimeMillis());
//目标对象调用方法
Object reault = method.invoke(target,args);
//目标对象执行方法后代码
System.out.println("结束时间:" + System.currentTimeMillis());
//返回方法执行结果
return reault;
}
//通过Proxy构造出目标对象的代理对象出来,该代理对象也实现了目标对象的接口。
public Object getProxy()
{
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(),this);
}
}
在以上代码可以看出,在目标对象执行前后加入了相关的切面操作逻辑。
Service接口
public interface Service {
void print();
}
ServiceImpl类
public class ServiceImpl implements Service {
public void print() {
System.out.println("这里是业务代码");
}
}
Main类
public class Main {
public static void main(String[] args) {
Service service = new ServiceImpl();
CustomInvocationHandler invocationHandler =
new CustomInvocationHandler(service);
service = (Service) invocationHandler.getProxy();
service.print();
}
}
以上执行结果为:
开始时间:1469067612678
这里是业务代码
结束时间:1469067612678