博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring源码-aop动态代理-5.3
阅读量:6676 次
发布时间:2019-06-25

本文共 2578 字,大约阅读时间需要 8 分钟。

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

  二、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中对代理进行了封装,但是基本处理方式就是这样的。

  

转载于:https://www.cnblogs.com/ll409546297/p/10115171.html

你可能感兴趣的文章
亚信安全与成都市政府达成战略合作
查看>>
SSH::Batch,在公有云中使用 ssh 工具箱
查看>>
“外围”消亡 企业安全防护需要新形态
查看>>
三招教你如何选择企业网盘
查看>>
轻量函数式 JavaScript:一、为什么要进行函数式编程?
查看>>
替代SSD?Crossbar进军中国存储市场
查看>>
红杉计越:AI、大数据、SaaS、云计算为何在中国一体迸发?
查看>>
阿里张勇:数据驱动的透明是平台治理的基础
查看>>
ActiveMQ - JMS,Transport,Persistence
查看>>
互联网大数据支撑生态银行建设
查看>>
视频会议系统迎来第四次浪潮
查看>>
报告显示:被调研中国企业超85%已从数字转型中获得回报
查看>>
东方日升拉美光伏电站项目 将进入首期施工
查看>>
软件探索性测试 笔记二
查看>>
将来也不会被破译的分布式存储系统
查看>>
光伏电站或成辅助服务市场“输家”
查看>>
今年光伏“领跑者”计划将升级扩围
查看>>
Java程序运行超时后退出或进行其他操作的实现
查看>>
手把手教你启用RemoteFX以及Hyper-V GPU卸载
查看>>
《交互式程序设计 第2版》一3.10 更进一步
查看>>