• Spring动态代理


    JDK动态代理

      特点:代理目标对象必须有接口

      实质:内存中构建了接口的实现类

    案例

    创建ISomeService接口和实现类

    //接口
    package cn.happy.day06Proxy; /** * Created by Administrator on 2018/3/8. */ public interface ISomeService { public void doSome(); } //实现类 package cn.happy.day06Proxy; /** * Created by Administrator on 2018/3/8. */ public class SomeServiceImpl implements ISomeService { public void doSome() { System.out.println("do Something"); } }

      

    Test测试类

    package cn.happy.day06Proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * Created by Administrator on 2018/3/8.
     */
    public class Test {
        public static void main(String[] args) {
            
            final SomeServiceImpl service=new SomeServiceImpl();
    
            ISomeService proxy = (ISomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
                
                /*
                * newProxyInstance(ClassLoader loader,   类加载器
                                   Class<?>[] interfaces,  接口数组
                                              InvocationHandler h)  InvocationHandler对象
                                              */
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    
                    /*
                    * 
                    * Object proxy,   代理对象
                     * Method method, 代理方法
                     * Object[] args  代理方法参数
                     * */
                    System.out.println("Before-------");
                    Object invoke = method.invoke(service, args);
                    return invoke;
                }
            });
    
            proxy.doSome();
        }
    }
    

      

    结果:

    CGLIB动态代理

      特点:在一个类没有接口的情况下进行代理

      实质:内存中构建了目标类型的子类

    案例:

    package cn.happy.day06Proxy;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.InvocationHandler;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * Created by Administrator on 2018/3/8.
     */
    public class CglibTest {
        public static void main(String[] args) {
            final SomeServiceImpl service=new SomeServiceImpl();
            //Enhancer类是CGLib中的一个字节码增强器
            Enhancer enhancer=new Enhancer();
    
            enhancer.setSuperclass(service.getClass());
            //设置回调函数
            enhancer.setCallback(new MethodInterceptor() {
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    /*
                   * o   代理对象
                   *
                   * method  代理目标方法
                   *
                   * objects 目标方法参数
                   *
                   * methodProxy  代理类的方法
                   * */
                    System.out.println("CGLIBbefore==========");
                    Object invoke = methodProxy.invoke(service, objects);
                    return invoke;
                }
            });
    
            SomeServiceImpl someService = (SomeServiceImpl)enhancer.create();
            someService.doSome();
        }
    }
    

    结果:

  • 相关阅读:
    android:background背景图片被拉伸问题
    面试积累(String和StringBuffer, StringBuilder的理解)
    面试积累(冒泡排序和选择排序)
    面试积累(java的内存分析)
    面试积累(java配置环境变量)
    异常积累(SQLException)
    【linux】fdisk磁盘分区
    【走马观花】十一月十八日通州雨
    【linux】CentOS查看硬件信息
    【linux】go安装及配置
  • 原文地址:https://www.cnblogs.com/xuchangqi1/p/8533445.html
Copyright © 2020-2023  润新知