美文网首页
JDK动态代理

JDK动态代理

作者: 焱J | 来源:发表于2016-07-21 10:23 被阅读26次

    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
    

    相关文章

      网友评论

          本文标题: JDK动态代理

          本文链接:https://www.haomeiwen.com/subject/brrbjttx.html