码迷,mamicode.com
首页 > 移动开发 > 详细

java高级架构师教程-mybatis中mapper接口的创建流程

时间:2020-12-09 12:05:19      阅读:6      评论:0      收藏:0      [点我收藏+]

标签:reg   doc   red   可扩展   就是   不用   lse   映射   elf   

 图灵学院  java高级架构师教程-mybatis中mapper接口的创建流程

 

    SqlSession的getMapper()

 

    首先,我们来看下FruitMappermapper=session.getMapper(FruitMapper.class);这段代码,意思很简单,根据传入的class获取这个对象的实例。这个流程有点复杂,阿粉带着大家来跟下源码:

 

    首先还是ctrl+左键点击getMapper方法,然后会进入到SqlSession的getMapper()方法。然后带着大家了解,SqlSession的默认实现类是DefaultSqlSession,所以我们直接看下getMapper()在DefaultSqlSession里面的实现:

 

    @Override

 

    public

 

    returnconfiguration.getMapper(type,this);

 

    }

 

    Configuration的getMapper()

 

    这里从configuration里面去获取,configuration是全局配置对象,也就是上下文。参数this是当前的SqlSession对象,继续跟进去看下:

 

    public

 

    returnmapperRegistry.getMapper(type,sqlSession);

 

    }

 

    MapperRegistry的getMapper()

 

    mapperRegistry对象是干什么的呢?继续点进去:

 

    public

 

    finalMapperProxyFactory

 

    if(mapperProxyFactory==null){

 

    thrownewBindingException("Type"+type+"isnotknowntotheMapperRegistry.");

 

    }

 

    try{

 

    returnmapperProxyFactory.newInstance(sqlSession);

 

    }catch(Exceptione){

 

    thrownewBindingException("Errorgettingmapperinstance.Cause:"+e,e);

 

    }

 

    }

 

    这里就不好看懂了,需要先看下了解下MapperRegistry这个类,我们一步一步来,跟着阿粉的思路走:

 

    publicclassMapperRegistry{

 

    privatefinalConfigurationconfig;

 

    privatefinalMap<Class

 

    publicMapperRegistry(Configurationconfig){

 

    this.config=config;

 

    }

 

    ...

 

    }

 

    了解一个类,首先看下成员变量和构造方法。这里config不用多说了吧,主要的是knownMappers这个成员变量。这就是个map对象,只是这个map对象的value值是个对象,所以又要去看下MapperProxyFactory这个对象,点进去:

 

    publicclassMapperProxyFactory

 

    privatefinalClass

 

    privatefinalMap

 

    publicMapperProxyFactory(Class

 

    this.mapperInterface=mapperInterface;

 

    }

 

    ...

 

    }

 

    首先,单独看一下类名MapperProxyFactory。这个名字很博学。一个好名字会让你知道它在做什么。因此,当您查看MapperProxyFactory时,首先会想到工厂模式。工厂模式有什么作用?谁创建了对象,创建了什么对象?创建MapperProxy对象。MapperProxy也很神秘,什么是Proxy?可以看出,这通常用于使用代理模式创建代理对象。因此,很显然MapperProxyFactory类是一个工厂,它创建了映射器的代理对象。

技术图片

    然后这个类里面存的是mapper的接口和接口里面的方法。

 

    最后,我们回到MapperRegistry类里面的getMapper()方法。现在是不是要清楚一些,通过mapper接口去map里面获取工厂类MapperProxyFactory,然后通过工厂类去创建我们的mapper代理对象。然后在看下getMapper()方法里面的mapperProxyFactory.newInstance(sqlSession);这段代码,继续点进去:

 

    publicTnewInstance(SqlSessionsqlSession){

 

    finalMapperProxy

 

    returnnewInstance(mapperProxy);

 

    }

 

    你看,阿粉猜测对不对,MapperProxy对象是不是出来了。然后看newInstance()这个方法:

 

    protectedTnewInstance(MapperProxy

 

    return(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),newClass[]{mapperInterface},mapperProxy);

 

    }

 

    两个newInstance()方法都在MapperProxyFactory这个类里面,这里就很明显嘛。典型的JDK代理对象的创建。

 

    好了,到这里我们的mapper对象就获取到了。

 

如果你想了解更多关于java架构师的专业知识,可以一起交流:11604这里面都是同行05674,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

java高级架构师教程-mybatis中mapper接口的创建流程

标签:reg   doc   red   可扩展   就是   不用   lse   映射   elf   

原文地址:https://www.cnblogs.com/tulingxueyuan/p/14087576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!