spring源码-aop动态代理-5.3

  一、动态代理,这是一个很强大的东西哦。研发过程中我们会常用很多业务类,但是存在一个问题。如何在不修改源码逻辑的情况下,加入自己的相关逻辑。比如异常处理,日志记录等!

  二、Java动态代理的两种方式JDK、CGLIB

  三、动态代理的例子

  1)需要代理的类 

public interface  AspectExcuteParent {
    void test();
}

public class AspectExcuteChild implements AspectExcuteParent{
    public void test() {
        System.out.println("test");
    }
}

  2)JDK代理(因为JDK的代理是基于接口做的,所以需要实现一个接口)

  public static void main(String[] args) {
        //创建代理
        AspectExcuteParent aspectExcuteParent = (AspectExcuteParent) Proxy.newProxyInstance(
                //classloader
                Thread.currentThread().getContextClassLoader(),
                //代理接收的接口
                AspectExcuteChild.class.getInterfaces(),
                //代理类
                new TestInvocationHandler(new AspectExcuteChild()));
        aspectExcuteParent.test();
    }

    static class TestInvocationHandler implements InvocationHandler{
        //所以私有化,目的执行
        private Object object;

        public TestInvocationHandler(Object object) {
            super();
            this.object = object;
        }

        /**
         * @param proxy (代理实例)
         * @param method (方法)
         * @param args (参数)
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before");
            Object result = method.invoke(object, args);
            System.out.println("after");
            return result;
        }
    }

  3)cglib的实现方式(基于类的方式实现)

  public static void main(String[] args) {
        //CGLIB创建类
        Enhancer enhancer = new Enhancer();
        //设置目标代理
        enhancer.setSuperclass(AspectExcuteChild.class);
        //设置回掉
        enhancer.setCallback(new TestMethodInterceptor(new AspectExcuteChild()));
        //创建代理
        AspectExcuteChild aspectExcuteChild = (AspectExcuteChild) enhancer.create();
        aspectExcuteChild.test();
    }

    static class TestMethodInterceptor implements MethodInterceptor {
        //保存的原始对象
        private Object object;

        public TestMethodInterceptor(Object object) {
            super();
            this.object = object;
        }

        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            //方法拦截处理
            System.out.println("before");
            Object result = method.invoke(object, objects);
            System.out.println("after");
            return result;
        }
    }

  四、动态代理的例子就这么多,aop中对代理进行了封装,但是基本处理方式就是这样的。

  

posted @ 2018-12-13 17:13  小不点丶  阅读(407)  评论(0编辑  收藏  举报