MyBatis源码的学习(2)---学习MyBatis中JAVA8新特性的使用

本文探讨了MyBatis 3.5.4-SNAPSHOT版本中如何利用Java8的新特性,特别是动态代理、默认方法、函数式编程和缓存技术。在获取Mapper对象时,MyBatis使用MapperRegistry的getMapper方法,通过MapperProxyFactory创建MapperProxy代理类。MapperProxy的invoke方法是执行SQL并转换结果的关键,其中运用了缓存技术提高效率。此外,文章还介绍了默认方法的概念,并以Function接口为例展示了如何使用computeIfAbsent方法。最后,通过比较Java8前后的代码,强调了函数式编程的简洁性和可读性。
摘要由CSDN通过智能技术生成

MyBatis的版本是:  3.5.4-SNAPSHOT

断点看从sqlSession中获取mapper对象。

我们知道,MyBatis使用的Java动态代理为接口(UserMapper)生成代理类。

简单说下:我们加载MaBatis的xml配置文件和Mapper文件,会生成一个 configuration 对象。这里对象里面有一个 

MapperRegistry类型对象(这个对象就是存储我们的Mapper.xml中的nameSpace对应的接口所对用的MapperProxyFactory对象。比如我这个:UserMapper 接口。)

这个MapperRegistry类的 getMapper 方法:第一个参数就是我们要被代理的接口(比如我的UserMapper 接口) ,第二个参数是sqlSession。逻辑很简单,先从Map对象 knownMappers 中获取到该接口UserMapper 对应的MapperProxyFactory类型的对象mapperProxyFactory。

然后mapperProxyFactory对象是什么呢?

查看源码:MapperProxyFactory类是我们的MapperProxy类的工厂类,再查看MapperProxy的源码。

public class MapperProxy<T> implements InvocationHandler, Serializable
看到没,实现了InvocationHandler接口。学过java动态代理的都知道,实现这个接口的类,需要重写invoke方法,而这个invoke方法就是对应的代理类到时候的执行逻辑。继续看我们之前的从MapperProxyFactory工厂里获取对象mapperProxy的方法:先我们初始化一个实现了InvocationHandler接口的类  MapperProxy,然后使用JAVA动态代理为我们的接口UserMapper生成代理类
protected T newInstance(MapperProxy<T> mapperProxy) {
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
  }

  public T newInstance(SqlSession sqlSession) {
    final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值