开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:Configuration和Mapper】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15946
Configuration和Mapper
紫色部分是配置信息,配置信息是在 MyBatis 运行的时候就需要读的。
在 MyBatis 中包含两个部分的配置信息:一个是 MyBatis本身的配置信息,我们在使用 Spring Boot的时候,这部分本身的配置信息是写在 application里面的;
另一个就是关于接口的信息,我们会用独立接口的 interface或者说用 interface对应的 xml文件去描述这些接口的配置信息。这两方面的配置信息会在 Spring框架去运行 MyBatis时全部读出来,两个配置信息里面如果有配错了的一部分内容,它在
实例化这些对象的时候会出错。
在 Spring的框架中,可以看到上面这个 Spring的 FactoryBean里面有一个属性叫做configuration,不是每一个属性都写的这个名字,但是所有指向 configuration的属性名字都叫做 configuration,代码里面都是这样的。所以在这个SqlSessionFactoryBean 中间是有一个 configuration的对象的,意味着当 Spring的框架运行MyBatis的时候,如果它带了MyBatis的包,就会去读所有 MyBatis的配
置信息,把它变成 configuration对象,就是这两类的配置信息,最后都是存在configuration 的对象。
在这两类配置信息的读取过程中,因为它是两种不同的格式,甚至有更多不同的格式,所以下面它分成了不同的 Builder。
可以看到它有一个 XMLConfigBuilder,它的配置信息是可以写成独立的 XML文件的,但都是比较早期的做法,如果形成独立的XML文件是需要通过XMLConfigBuilder 去读那个独立的 MyBatis配置文件的。那对于Mapper来说就有两种写法,一种是通过 XML去写,另一种是通过 Annotation去写,所以他有两个Builder,分别是用来去读 XML的配置信息,
就是 XMLConfigBuilder和MapperAnnotationBuilder,是用来去读写在 Mapper接口中间的配置信息的注解信息。所以无论是什么样的 Builder,最后读进来的都是
configuration。
configuration 读进来以后,以怎样的方式存储在这种 configuration对象中间呢?configuration 对象中也是有非常多属性的,但是今天讲关于 Mapper的这些配置,红色的部分就是Mapper的配置。
在 configuration中间,Mapper 的配置是写在了 MapperRegistry的对象中间,所以可以看到它有一条双向属性,就是它既是从 configuration指向了MapperRegistry,又是从 MapperRegistry指向 configuration。MapperRegistry中间存的是所有 Mapper的信息,所以可以看到它里面有一个属性叫做knownMapper,就是它知道的 Mapper读进去的,是用一个 Mapper的格式来存
的;这个白色的《Mapper》是类,不是对象,因为它只是一个接口的定义。JAVA反射机制里的类作为它的T,值就图中的是 MapperProxy Factory。它不把这个对象放到配置里面,因为在配置里面写的信息并不代表这个对象真正会用,我们经常
可能会写了很多的配置的 Mapper,但是其实可能没用到那些,就没有必要把Mapper实例画出来。它在驻入的时候把需要的Mapper的对象驻进去,如果没有驻入或者没有在任何地方要用到 Mapper就不需要把它实例画出来,所以它的 key是它的类,而它的 value就是 Mapper的ProxyFactory。
工厂对象准备用它来制造我们要驻进去的 Mapper对象,这是它的配置信息,红色部分就是要驻进去时候做的 Mapper的 Proxy,它不可能做出一个接口对象来,因为这个接口是在外面定义的,所以不可能用代码写出来一个 Mapper的对象。
它用的个 JAVA 的动态代理机制,当我们去调 Mapper的任何的一个方法时,都是调 MapperProxy 的方法去模拟实现接口的所有方法,所以它最后驻进去的是我们看到的 MapperProxy。
下面是 MapperProxy 如何去执行的一些相关的类,红色部分里面就是 Mapper的信息,而且我们所说的面向对象特征表现就是在这个 Mapper 和 configuration 里面,因为这两部分里面包含了它的 Mapper 和 method 的接口以及参数。
我们传进去的参数是如何映射到 Mapper定义中间的 SQL语句的参数里面,以及它的返回值是怎样变成我们所需要的对象的,都是在红色和紫色部分里面,也就是定义的部分。