MyBatis接口的简单实现原理分析

 更新时间:2017年07月09日 14:46:43   作者:蘸点酱  
这里仅仅举个简单例子来说明原理,不是完全针对MyBatis的,这种思想我们也可以应用在其他地方。地mybatis接口实现原理感兴趣的朋友一起看看吧

用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用?

那是因为MyBatis使用Java动态代理实现的接口。

这里仅仅举个简单例子来说明原理,不是完全针对MyBatis的,这种思想我们也可以应用在其他地方。

定义一个接口

public interface MethodInterface { String helloWorld(); }

 实现动态代理接口

public class MethodProxy<T> implements InvocationHandler {
  private Class<T> methodInterface;
  public MethodProxy(Class<T> methodInterface) {
    this.methodInterface = methodInterface;
  }
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("=========================");
    System.out.println("方法名:" + method.getName());
    //针对不同的方法进行不同的操作
    return null;
  }
}

这里针对invoke方法简单说说MyBatis的实现原理,在该方法中,我们通过Method能够获取接口和方法名,接口的全名相当于MyBatis XML中的namespace,方法名相当于具体一个方法中的id。也就是说通过动态代理后,可以通过SqlSession来通过namespace.id方式来调用相应的方法。使用接口更方便,但是是一种间接的方式。

动态代理工厂类

public class MethodProxyFactory {
  public static <T> T newInstance(Class<T> methodInterface) {
    final MethodProxy<T> methodProxy = new MethodProxy<T>(methodInterface);
    return (T) Proxy.newProxyInstance(
        Thread.currentThread().getContextClassLoader(), 
        new Class[]{methodInterface}, 
        methodProxy);
  }
}

通过该工厂类可以生成任意接口的动态代理类。

测试

MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.class);
method.helloWorld();

总结

一般谈到动态代理我们通常的用法都是处理事务、日志或者记录方法执行效率等方面的应用。都是对实现类方法的前置或者后置的特殊处理。

通过本文,其实可以看到另一种应用方向,那就是不需要实现类,直接通过动态代理执行接口方法,MyBatis使用这种方式方便了我们调用方法,利用这种思路我们也许可以在别的方面做出一些更好的设计。

以上所述是小编给大家介绍的MyBatis接口的简单实现原理分析,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

相关文章

  • SpringBoot中的文件上传和异常处理详解

    SpringBoot中的文件上传和异常处理详解

    这篇文章主要介绍了SpringBoot中的文件上传和异常处理详解,对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息,对于浏览器客户端,响应一个"whitelabel"错误视图,以HTML格式呈现相同的数据,需要的朋友可以参考下
    2023-09-09
  • SpringMVC处理数据输出的实例代码

    SpringMVC处理数据输出的实例代码

    这篇文章主要给大家介绍了关于SpringMVC处理数据输出的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Intellij IDEA 2017.3使用Lombok及常用注解介绍

    Intellij IDEA 2017.3使用Lombok及常用注解介绍

    这篇文章主要介绍了Intellij IDEA 2017.3使用Lombok及常用注解介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java CAS底层实现原理实例详解

    Java CAS底层实现原理实例详解

    这篇文章主要介绍了Java CAS底层实现原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • JDK17、JDK19、JDK1.8轻松切换(无坑版,小白也可以看懂!)

    JDK17、JDK19、JDK1.8轻松切换(无坑版,小白也可以看懂!)

    在做不同的java项目时候,因项目需要很可能来回切换jdk版本,下面这篇文章主要介绍了JDK17、JDK19、JDK1.8轻松切换的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Spring Boot多数据源事务@DSTransactional的使用详解

    Spring Boot多数据源事务@DSTransactional的使用详解

    本文主要介绍了Spring Boot多数据源事务@DSTransactional的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringBoot实现无限级评论回复的项目实践

    SpringBoot实现无限级评论回复的项目实践

    本文主要介绍了SpringBoot实现无限级评论回复的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • SpringBoot配置文件启动加载顺序的方法步骤

    SpringBoot配置文件启动加载顺序的方法步骤

    SpringBoot的启动加载顺序涉及多个步骤和组件,通过分层和优先级机制加载配置文件,确保在启动时正确配置应用程序,本文就来介绍一下SpringBoot配置文件启动加载顺序的方法步骤,感兴趣的可以了解一下
    2024-11-11
  • Java几个重要的关键字详析

    Java几个重要的关键字详析

    这篇文章主要介绍了Java几个重要的关键字详析,文章围绕主题展开详细的内容介绍,具有一定的参考一下,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-07-07
  • 浅谈Java回收对象的标记和对象的二次标记过程

    浅谈Java回收对象的标记和对象的二次标记过程

    这篇文章主要介绍了浅谈Java回收对象的标记和对象的二次标记过程的相关内容,小编觉得还是挺不错的,这里给大家分享一下,需要的朋友可以参考。
    2017-10-10

最新评论