zoukankan      html  css  js  c++  java
  • 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中对代理进行了封装,但是基本处理方式就是这样的。

      

  • 相关阅读:
    utf8和utf8mb4的区别
    【JSP 标签】选择判断c:choose
    【JSP 标签】格式化日期
    【Spring 核心】AOP 面向切面编程
    【Spring 核心】高级装配
    【Spring 核心】装配bean(三)XML配置
    【Spring 核心】装配bean(二) JavaConfig装配
    【Spring 核心】装配Bean(一) 自动化装配
    【Js应用实例】图片预览
    【Js应用实例】限制上传图片大小
  • 原文地址:https://www.cnblogs.com/ll409546297/p/10115171.html
Copyright © 2011-2022 走看看