在spring启动的时候,spring会根据我们配置的有关mapper.xml的路径加载此路径下的xml文件,得到一个List<Resource>的集合,然后将这个集合转化成Resource[]数组赋值到SqlSessionFactoryBean中的mapperLocations(其实也是一个Resource[])

带目前位置这些mapper的配置文件就被维护到一个SqlSessionFactoryBean中了,然后调用SqlSessionFactoryBean的getObject()方法通过buildSqlSessionFactory()方法创建一个SqlSessionFactoryBean实例,在调用buildSqlSessionFactory的时候,会创建一个XMLConfigBuilder对象然后获取一个configuration类型的对象,这个对象很关键,后面会用到,接着会对mapperLocations进行循环,然后使用XMLMapperBuilder对每个mapperLocations的流解析成document对象,接着会调用XMLMapperBuilder的parse()方法解析对document对象的每个结点并生成对象,当然在解些此resource的时候会判断configuration对象中是否已经有此resource,如果有就不解析如果没有才会解析,并将解析完的各个子结点放入到configuration中,其实就是放到不同的map集合中,而我们常见的insert,update等结点,会被维护到一个Map<String, MappedStatement> mappedStatements的map中,key就是namespace加上标签的id(例如:com.org.userMapper.selectOne之所以这样做是为了保证key的唯一性),value中存的MappedStatement对象其实就是对sql标签解析的结果,到这里mapper.xml就解析完成了,然后会将configuration作为参数通过DefaultSqlSessionFactory来创建一个sqlsessionFactory的实例对象,而对于解析失败的会进行循环处理处理,最后是通过namaspace维护到一个configuration中的一个类型为MapperRegistry对象中,而mapperRegistry

会调用addmapper方法把这个mapper维护到一个Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap()中,这个knownMappers 非常重要,他会在我们对接口进行调用的时候通过动态代理获取mapper接口实例,找到我们要找到的sql,当然在找到mapper实例之后还要经过一系列的参数处理器,sql处理器,然后选择合适的执行器,最后执行器将结果交给执行结果处理器处理返回给sqlsession。

动态代理的过程

通过接口的calss文件类型从knownMappers中获取一个mapper的代理工厂,在MapperProxyFactory代理工厂同调用newInstance()方法通过sqlsession实例和接口类型还有methodCach获取MapperProxy实例,然后再通过jdk动态代理来生成我们想要代理类

												

Mybatis的实现原理的更多相关文章

  1. Mybatis接口编程原理分析(三)

    前面两篇博客Mybatis接口编程原理分析(一)和Mybatis接口编程原理分析(二)我们介绍了MapperProxyFactory.MapperProxy和MapperMethod的操作及源码分析, ...

  2. Mybatis接口编程原理分析(二)

    在上一篇博客中 Mybatis接口编程原理分析(一)中我们介绍了MapperProxyFactory和MapperProxy,接下来我们要介绍的是MapperMethod MapperMethod:它 ...

  3. 深入理解Mybatis技术与原理

    目录 第1章 Mybatis简介 1.1 传统的JDBC编程 1.2 ORM模型 1.4 MyBatis 1.5 什么时候用MyBatis 第2章 MyBatis入门 2.2 MyBatis构成 2. ...

  4. mybatis(一、原理,一对多,多对一查询)

    MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...

  5. Mybatis之工作原理

    1.Mybatis的架构 1.1 Mybatis的框架分层 1.2 MyBatis的实现原理 mybatis底层还是采用原生jdbc来对数据库进行操作的,它支持定制化 SQL.存储过程以及高级映射的优 ...

  6. mybatis 插件的原理-责任链和动态代理的体现

    目录 1 拦截哪些方法 2 如何代理 3 代理对象 4 责任链设计模式 @ 如果没有自定义过拦截器, 可以看我前面的文章.如果不知道 JDK 动态代理怎么使用的, 可以看我这文章. 责任链设计模式理解 ...

  7. Mybatis简介与原理

    经常面试别人或者被面试,对Mybatis简介与原理这个问题的回答千差万别,为了更好的服务与以后,来个原理介绍. 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 20 ...

  8. MyBatis整合Spring原理分析

    目录 MyBatis整合Spring原理分析 MapperScan的秘密 简单总结 假如不结合Spring框架,我们使用MyBatis时的一个典型使用方式如下: public class UserDa ...

  9. 深入详解Mybatis的架构原理与6大核心流程

    MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架. 如果你想要进入一线大厂,能够熟练使用 MyBatis 开发已经 ...

  10. MyBatis框架及原理分析

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 MyBatis的主要设计目的就 ...

随机推荐

  1. idea断点调试学习随笔

    1,rerun XXX,这个就是直接重新跑某个程序.2,这个相当于eclipse里面的f8,直接跑完,到下一个断点停下,没有就直接跑完程序.3,停止项目或者程序.要是自己的main呢,点一下就停下了, ...

  2. ping 域名

  3. win10不能将文件拖到另外一个程序中去的解决办法

    author: headsen chen date: 2019-07-25   14:48:32 notice : 个人原创 新建一个 aa.txt的文本文档: Windows Registry Ed ...

  4. 我的一个PLSQL【我】 循环嵌套、游标使用、变量定义、查询插入表、批量提交事务、字符串截取、动态sql拼接执行

    代码块: --CREATE OR REPLACE PROCEDURE PRO_REVENUE_STATISTICS --IS DECLARE --计数器 ins_counter PLS_INTEGER ...

  5. Spring cloud微服务安全实战-6-4权限控制改造

    授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...

  6. 全面系统Python3入门+进阶-1-2 Python的特性

    结束

  7. 【Leetcode_easy】1025. Divisor Game

    problem 1025. Divisor Game 参考 1. Leetcode_easy_1025. Divisor Game; 完

  8. 【Leetcode_easy】997. Find the Town Judge

    problem 997. Find the Town Judge solution: class Solution { public: int findJudge(int N, vector<v ...

  9. 【Leetcode_easy】965. Univalued Binary Tree

    problem 965. Univalued Binary Tree 参考 1. Leetcode_easy_965. Univalued Binary Tree; 完

  10. @media 适配兼容

    /* 兼容iphone4/4s */ @media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){ } /* 兼容iphon ...