MyBatis的动态代理

👏作者简介:大家好,我是Rockey,不知名企业的不知名Java开发工程师
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦,如果感觉和您的认知有一些偏颇,可以联系博主指正错误
📝联系方式:本人微信公众号 Rockey小何同学,关注后进群,大家一起学习,一起读书,一起对抗互联网寒冬👀

问题:Mybatis Mapper 接口没有实现类,怎么实现的动态代理?
答案:Mybatis 底层封装使用的 JDK 动态代理

什么是JDK 动态代理

假设有一个表示接口的 Class 对象(有可能只包含一个接口,) 它的确切类型在编译时无
法知道。这确实有些难度。要想构造一个实现这些接口的类,就需要使用 newlnstance 方法
或反射找出这个类的构造器。但是, 不能实例化一个接口,需要在程序处于运行状态时定义
一个新类。
为了解决这个问题, 有些程序将会生成代码;将这些代码放置在一个文件中;调用编译
器;然后再加载结果类文件。很自然, 这样做的速度会比较慢,并且需要将编译器与程序放
在一起。而代理机制则是一种更好的解决方案。代理类可以在运行时创建全新的类。这样的
代理类能够实现指定的接口。尤其是,它具有下列方法:

  • 指定接口所需要的全部方法。
  • Object 类中的全部方法, 例如, toString、 equals 等。

然而,不能在运行时定义这些方法的新代码。而是要提供一个调用处理器( invocation
handler)。调用处理器是实现了 InvocationHandler 接口的类对象。在这个接口中只有一个方法:
Object invoke(Object proxy, Method method, Object □ args)
无论何时调用代理对象的方法,调用处理器的 invoke 方法都会被调用, 并向其传递
Method 对象和原始的调用参数。 调用处理器必须给出处理调用的方式
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 点击跳转浏览

创建代理对象

要想创建一个代理对象, 需要使用 Proxy 类的 newProxylnstance 方法。 这个方法有三个
参数:

  • 一个类加栽器(class loader。) 作为 Java 安全模型的一部分, 对于系统类和从因特网
    上下载下来的类,可以使用不同的类加载器。有关类加载器的详细内容将在卷 n 第 9 章中讨论。目前, 用 null 表示使用默认的类加载器。
  • 一个 Class 对象数组, 每个元素都是需要实现的接口。
  • 一个调用处理器
    示例如下:

Subject 接口

public interface Subject {
   
   
    String sayHello();
}

ProxyInvocationHandler类

public class ProxyInvocationHandler implements InvocationHandler {
   
   


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
   
        System.out.println("进入代理调用处理器");
        return "success";
    }
}

ProxyTest类

public class ProxyTest {
   
   
    public static void main(String[] args) {
   
   

      
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间不会赖着不走

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值