Mybatis中的动态代理

本文探讨了动态代理在软件开发中的应用,重点讲解了JDK动态代理如何解决接口变化导致的问题,以及CGLib的子类代理实现方式。涉及的关键技术和类包括Proxy、InvocationHandler,以及两者在业务功能切换中的灵活性。
摘要由CSDN通过智能技术生成

DynamicProxy

为什么使用动态代理?

  • 当接口中的实现方法发生改变的时候,那么实现接口的实现类也会随之而改变

  • 代理对象发生改变,测试程序也要发生改变,一切都要随之发生改变

  • 可以使用动态代理解决这个问题


  • 代理对象在程序运行的过程中动态在内存中构建,可以灵活的进行业务功能的切换

JDK动态代理

  1. 目标对象必须实现业务接口

  2. JDK代理对象不需要实现业务接口

  3. JDK动态代理的对象在程序运行前不存在,在程序运行是动态的在内存中构建

  4. JDK动态代理灵活的进行业务功能的切换

  5. 本类中的方法(非接口中的方法不能被代理)

JDK动态代理用到的类和接口(两个类一个接口)

  • 它是使用现在的工具类完成JDK动态实现

  1. Proxy

    1. 他是java.lang.reflect.Proxy包下的类

      1. public static Object newProxyInstance(ClassLoader loader,//类加载器
        Class<?>[] interfaces,//目标对象实现的所有接口
        InvocationHandler h //它就类似于Agent的功能,代理的功能和目标对象的业务功能调用在这.这是个接口
        ){...}

    2. method类

           反射用的类,用来进行目标对象的方法的反射调用。

    3. (外面调用什么方法,method就可以反射代理什么方法,可以指代那个方法)

      method对象借助正在调用的sing(),show() . method==sing();method==show()

      method.invoke;//===>手动调用目标方法 sing(),show()
    4. InvocationHandler接口

      • 它是用来实现代理和业务功能的,在调用时使用匿名内部实现。

CGLib

  • 又称为子类代理,通过动态的在内存中构建子类对象,重写父类的方法进行代理功能的增强。

  • 存在意义

    • 如果目标对象没有是心啊接口,则只能通过CGLib子类带了来进行功能增强。

  • 子类代理是通过对象字节码框架ASM来实现的。在Sprint框架里面配置比较简单,Mybatis主要还是使用JDK代理

代理模式

  • 代理模式:

    • 无法访问目标对象,通过代理对象进行访问,而且增强式的访问。适合进行业务的扩展

  • 代理模式的功能

    • 增强功能

    • 限制目标对象的访问

  • 分类

    • 静态代理

      • 目标对象和代理对象实现同一个业务接口

      • 代理对象实现功能时必须依靠目标对象自己实现

      • 当业务发生变化是,要进行大量的代码改动,实现复杂

      • 代理类是以.java的文件形式存在,在调用前就已经存在,所以比较死板

      • 实现

    • 动态代理

      动态代理代码的梳理

      InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
      SqlSession sqlSession = factory.openSession();
      • JDK动态代理

        • 代理对象不需要实现业务接口

        • 代理对象是在程序运行时动态的在内存中够时间的

        • 目标对象不许要实现接口,才可以使用JDK的动态代理

      • CGLib动态代理

        • (子类代理【简易版本】)

        • 完整版本要等到Spring框架之后

      • 通过流的方式获得资源,使用文件流读取核心配置文件(config文件)

      • 通过建造者模式创建了SqlSessionFacroty工厂

      • 从工厂中取出代理对象,代理对象有着目标对象的所有方法和属性,客户端对象就可以直接访问代理对象来达到和目标对象交流的目的

    • UserMapper uMapper = sqlSession.getMapper(UserMapper.class);

      * 这是一个映射器,代码的作用是将UserMapper接口中的方法和属性全部一一检索到uMapper映射器里面,就可以通过这个映射器取代理目标接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值