Mybatis源码解析 - mapper代理对象的生成,你有想过吗

    本人幼教老师,冬天戴帽子进教室,被小朋友看到,这时候,有个小家伙对我说:老师你的帽子太丑,赶紧摘了吧。我逗他:那你好好学习,以后给老师买个漂亮的?这孩子想都没想立刻回答:等我赚钱了,带你去韩国整形

Mybatis源码解析 - mapper代理对象的生成,你有想过吗

简单示例

  我们先来看一个纯粹的mybatis示例(不集成spring等其他框架),代码很简单,结构如下

Mybatis源码解析 - mapper代理对象的生成,你有想过吗

  完整代码地址:mybatis;mapper层和我们平时说的dao层指的是同一个内容,都是数据库操作的封装,但是在没有集成mybatis时,dao层的接口都是需要我们手动去写其实现类,可在上图中我们却发现:我们并没有手动去实现PersonMapper接口,但工程却能实实在在的查询数据库,获取我们需要的数据,如下图所示

Mybatis源码解析 - mapper代理对象的生成,你有想过吗

  从上图我们发现,PersonMapper实例是一个代理对象,我们操作的其实是PersonMapper的代理实现;也就是说不用我们手动去实现PersonMapper接口,mybatis会动态生成PersonMapper的代理实例,然后由代理实例完成数据库的操作

  那么问题来了,mybatis是何时、何地、如何生成mapper代理实例的呢?我们接着往下看

源码分析

  针对上述问题,我们来跟下mybatis源码

  SqlSessionFactory的创建

Mybatis源码解析 - mapper代理对象的生成,你有想过吗

    XMLConfigBuilder解析Mybatis配置文件(mybatis-config.xml),将配置文件中各个属性解析到Configuration实例中,然后以Configuration实例构建SqlSessionFactory(实际是DefaultSqlSessionFactory);其中parseConfiguration方法是解析的具体过程,有兴趣的可以更深一步的去探究

Mybatis源码解析 - mapper代理对象的生成,你有想过吗

Mybatis源码解析 - mapper代理对象的生成,你有想过吗

/** * root是以configuration标签开始的文档树 * 解析配置文件中的各个标签,并存放到Configuration实例对应的属性中 * 解析完成之后,配置文件中的内容全部解析到了Configuration实例中 * @param root */ private void parseConfiguration(XNode root) { try { //issue #117 read properties first propertiesElement(root.evalNode("properties")); // 解析配置文件中的properties标签 Properties settings = settingsAsProperties(root.evalNode("settings")); // 解析配置文件中的settings标签 loadCustomVfs(settings); typeAliasesElement(root.evalNode("typeAliases")); // 解析配置文件中的typeAliases标签 pluginElement(root.evalNode("plugins")); // 解析配置文件中的plugins标签 objectFactoryElement(root.evalNode("objectFactory")); // 解析配置文件中的objectFactory标签 objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); // 解析配置文件中的objectWrapperFactory标签 reflectorFactoryElement(root.evalNode("reflectorFactory")); // 解析配置文件中的reflectorFactory标签 settingsElement(settings); // read it after objectFactory and objectWrapperFactory issue #631 environmentsElement(root.evalNode("environments")); // 解析配置文件中的environments标签 databaseIdProviderElement(root.evalNode("databaseIdProvider")); // 解析配置文件中的databaseIdProvider标签 typeHandlerElement(root.evalNode("typeHandlers")); // 解析配置文件中的typeHandlers标签 mapperElement(root.evalNode("mappers")); // 解析配置文件中的mappers标签 } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdwpg.html