图灵学院 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)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!