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
上一篇下一篇

猜你喜欢

热点阅读