zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    

    结果:

  • 相关阅读:
    C++互斥器:Semaphores
    C++互斥器:Mutex
    内联函数(inline)
    C++显式转换
    线程同步控制
    拷贝构造函数——防篡改
    extern关键字
    虚析构、纯虚析构
    类的友元关系
    char 与 unsigned char的本质区别
  • 原文地址:https://www.cnblogs.com/xuchangqi1/p/8533445.html
Copyright © 2011-2022 走看看