自己钻研钻研
这MyBatis是如何通过接口找到对应的xml文件的啊?
好家伙,直接开始扒源码
朝getMapper往里点。
进入到了DefaultSqlSession.class,哪里不会点哪里继续点。
又来一个,继续点
这会儿终于出现逻辑代码了,硬着头皮开始看。
这个函数分两部分来看,首先是从map集合中获取接口代理,map集合的来源,第二部分获取代理后实例化,获取接口的方法,执行sql。
其中第一部分的集合是如何导入的,就得从addMapper方法说起了
往上追溯该方法的调用是在SqlSessionFactory.build();时对配置文件的解析,其中对节点mappers的解析。
这步是通过全路径来查找对应的xml。
第二部分的代码主要就是通过动态代理获取接口名字来对应xml中的id。
最后则是在MapperProxy.java中进行方法的执行,通过invoke,实际调用了excute进行对sql语句的执行。
总结
1)解析xml文件时,将Mapper type和MapperProxyFactory的对应关系封装到Configuration中,以备后面使用
2)在SqlSession.getMapper(type)时,就是从Configuration中获取type对应的MapperProxyFactory
3)MapperProxyFactory用于获取MapperProxy
4)MapperProxy是一个动态代理类,真正的实现还是交由SqlSession来处理