• JDK动态代理 cglib动态代理的深入理解


    代理: 可以从社会分工来理解代理,我们每个人都有自己明确的社会分工,比如我的社会分工是程序员, 而代理商,也叫中介也是一种职业。因为社会分工的明确才能提高生产力! 

               举个栗子:

       如果我想去香港买奶粉,那么我可以有两种选择,一种是自己抽时间自己去买奶粉,一种是委托给代购去买奶粉。如果自己去买,那么需要自己去办理通行证,去制定行程路线,去做购物攻略,一个人怕走丢还要约同伴.......等等各种让自己分心分神的事情,那么就生产力而言,如果我委托给代购,那么我能节省更多的时间、精力去做好自己的社会分工,更快的提升自己,让自己的社会价值得到更快的提升。 所以,代理的出现就是为了将社会分工更彻底,我专注就好我的职业就好(代码中的业务逻辑),其他的都可以交给别人去做,不用都自己亲力亲为(亲力亲为导致生产力的低下)。 这样,每个人的社会职责明确,专注做好自己的社会分工,才能实现效率的最大化。

    spring的应用:  AOP的底层实现技术    

       OOP:纵向抽象(继承)解决冗余代码    

       AOP:横向抽象解决冗余代码,以及从自己的业务逻辑(主业)中剥离横切逻辑(代理做的)     

    一:JDK动态代理      通过一个实例来理解

    接口: BookFacade

    package reflection.demo08;
    
    public interface BookFacade {
    
       /**
        * 接口
        */
       void addBook();
    
    }

    接口实现类:BookFacadeImpl

    package reflection.demo08;
    
    public class BookFacadeImpl implements BookFacade{
    
        /**
         * 接口实现类
         */
        @Override
        public void addBook() {
            System.out.println("增加图书方法。。。");
        }
    }

    代理类package reflection.demo08;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    
    
    public class BookFacadeProxy implements InvocationHandler {
    
        private Object target;
    
        /**
         * 绑定委托对象并返回一个代理类
         *
         * @param target
         * @return
         */
        public Object bind(Object target) {
            this.target = target;
            //取得代理对象          这里的this指的是当前类的实例(实现了InvocationHandler接口)
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);   
        }
    
    
    
        @Override
        /**
         *   重写InvocationHandler接口的抽象方法
    * proxy:代理类的实例
    *  method: 目标类(被代理类)的方法
    * args: 代理类实例调用方法的时候传递的参数
    */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("事物开始"); //执行方法 result = method.invoke(target, args); System.out.println("事物结束"); return result; } }

     测试类:

    package reflection.demo08;
    
    public class TestProxy {
    
    
        /**
         * JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理
         * @param args
         */
        public static void main(String[] args) {
            // 创建代理类的实例    代理类实现了InvocationHandler接口
            BookFacadeProxy proxy = new BookFacadeProxy();
            // 调用代理类的方法  获取指定类的代理类的实例
            BookFacade bookProxy = (BookFacade) proxy.bind(new BookFacadeImpl());
            // 注意BookFacade是接口  bookProxy是接口的实现类,  动态代理的方式创建的BookFacade接口的实例,
            bookProxy.addBook();
        }
    }

    java提供的jdk动态代理核心接口:InvocationHandler  

    /**
     * proxy: 代理类的实例
     * method:目标类的方法
    * args: 代理类实例调用方法时候传递过来的参数
    */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

    java提供的jdk动态代理核心类:Proxy类的方法 

        /**
         *  loader: 指定代理类的类加载器
         *  interfaces: 代理类实现的接口
       *
    h: 接口实现类的实例
       *
    返回值: 接口实现类的代理类!!!!!!!!!
    */ @
    CallerSensitive public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { ..... }

              

          

    打断点来理解下:

           

  • 相关阅读:
    R语言从基础入门到高级
    Web前端工程师职业学习路线图,分享!
    IOS中nil/Nil/NULL的区别
    Core Animation系列之CADisplayLink
    CADisplayLink 及定时器的使用
    iOS定时器NSTimer的使用方法
    IOS中定时器NSTimer的开启与关闭
    【IOS基础知识】NSTimer定时器使用
    IOS 实现自定义的导航栏背景以及自定义颜色的状态栏(支持7.0以及低版本)
    iOS7中计算UILabel中字符串的高度
  • 原文地址:https://www.cnblogs.com/njqa/p/8031956.html
Copyright © 2020-2023  润新知