Mybatis源码学习之一——基础支持层总结

源码+注释地址:https://github.com/flyChineseBoy/mybatis_study

mybatis
   基础支持层。

-----------1、解析器模块(基础支持)------------
1、XML解析方式
   DOM解析(JDK官方,也是mybatis使用的解析方式):基于树形结构的解析器,它会将整个XML文档读入内存并构建一个Dom树。
   SAX是基于事件模型的XML解析方式,它只需要加载XML的一部分。当SAX解析器解析到某个特定节点的时候,会按照特定逻辑(可自定义)继续加载并回调。
   还有stA等等。
2、XPath
   Xpath是一种寻找节点的规则,也常用于html的解析(爬虫会经常使用到)。
   Xpath之于XML就像sql之于数据库。

3、XpathParse包含属性。  
   ResolveEntity : 包含dtd文件数据。
   Document : 最后结果,包含整个xml文件的数据。
   Xpath。

4、XML基础数据结构
   int、short、Float、Long、Double、String、XNode。



-----------2、反射模块(基础支持)------------
1、Reflection。
   每个Reflection对象对应一种JAVA类,包含有JAVA类的成员变量、setter、getter、构造方法、类的type。
2、TypeParameterResolver。
   参数解析器:用来得到(参数、成员变量、返回值等的)变量类型的Type对象。
       同时,该类中内含 各种Type的实现类型,包括ParameterizedTypeImpl(参数化类型,即泛型)、WildcardType(通配符)、GenericArrayTypeImpl(数组)。
           * Type也是Class的父类接口。
           * map的类型就是【Map<String,Long>】,那这个类型是类吗?不是,它是一个组合的类型,【Map】是它的原始类型【RawType】,【<String,Long>】是它的实际参数【ActualTypeArguments】。这个组合类型有一个学名叫做【ParameterizedType】。
           * TypeVariable 即<K,V>中的K和V。
3、resolveFieldType(return/param) -> resolveType -> resolveTypeVar(resolveParameterizedType/resolveGenericArrayType/普通class类型) -> 
   srcType 指的是该成员、或方法所属的类的Type。
4、ObjectFactory -- DefaultObjectFactory ,通过class类型构造实例(无参/有参)。
5、property包下。
   三个工具类:PropertyTokenizer:解析诸如  resultMap 中 'order[0].item.name' 的属性表达式。
           PropertyNamer: 方法名到属性名的转换,以及检车是否geter、setter
           PropertyCopier:不同类型的bean之间的属性值拷贝。 可以直接拿来用 *****
   * Iterator有三个方法:hasNext,next、remove
6、metaCalss。
   通过 Reflector 和 PropertyTokenizer 解析复杂的属性表达式。
7、metaObject。
   用于 将 Object  解析成 ObjectWrapper 对象。


-----------3、类型转换(基础支持)------------
1、TypeHandler接口-> BaseTypeHandler抽象类 -> 各种基础类型的Handler。
   TypeHandler的功能主要是通过PreparedStatement进行sql中参数的set和get。
2、TypeHandlerRegister。
   注册所有指定的TypeHandler到Map中。
   3.1.0之前,主要是通过@MappedTypes注解来注册基本类型;之后可以通过实现TypeReference接口来替代@MappedTypes;
3、TypeAliasRegister。
   别名注册器。
   

-----------4、日志模块(基础支持)------------
1、LogFactory。
   按照一定顺序尝试获取一种日志组件的实例化logger。:useSlf4jLogging、useCommonsLogging、useLog4J2Logging、useLog4JLogging、useJdkLogging、useNoLogging(没日志组件可用)。
2、Log接口 --> log4j、jdkLog等实现类(适配器实现)。
   适配器模式:我方提供API,需要第三方框架来符合API规范,这时候可以用一个adapter实现我们的API、组合第三方的实例,进行方法的实现。
3、jdbc下的BaseJdbcLog,一个抽象类,用于jdbc下connection、statement等行为的日志打印。
    --> ConnectionLogger、PreparedStatement等集成BaseJdbcLog,同时代理Connection、PrepareStatement等jdbc对象,在其行为前后做日志输出。


-----------5、资源加载(基础支持) -------------------
1、类加载器:
   BootStrap ClassLoader : 加载rt.jar里面的class。
   Extension ClassLoader : 加载 jre/lib/ext/ 或者 java.ext.dirs 系统属性指定的目录下的类。
   System ClassLoader : 加载classpath下载的类。
   自定义 ClassLoader : 如TOmcat、JBoss等也实现了自己的ClassLoader。
2、ResolverUtils,用于加载对应path下的url、指定注解的class。
3、单例模式:
   双重校验所:为什么加volidate? 假设线程A、B,可能A的实例对象刚刚被分配空间(实例变量、代码块赋予默认值),但是初始化还没有完成,此时B线程进来就拿到了一个不完整的实例的引用。
   VFS实例使用静态内部类实现单例。
4、VFS 虚机文件系统。用于加载指定class。


-----------6、数据源模块(基础支持)   -------------------
1、DataSource --> UnPooledDataSource --> (继承)PooledDataSource
   UnPooledDataSource 是 PooledDataSource 父类,最大的区别在于PooledDataSource使用了数据库连接池。
2、PoolState。
   PooledDataSource 通过 PoolState 维护连接池,维护一个活跃连接列表、一个空闲连接列表。
   对这两个列表的元素控制,逻辑都在 PooledDataSource 的pop*、push*方法中。
3、PooledConnection。
   ‘池式’ 连接,是对java原生connection类的动态代理对象。

   * 什么时候产生数据库连接?
   * CopyOnWrite并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的访问和更新场景。
   * Enumeration只用来遍历Vector,Vector即arrayLIst的sync版。


-----------7、事务管理模块 (基础支持)-------------------
1、TransactionFactory 接口  --> ( JDBCTransactionFactory、ManageredTransactionFactory    )
   Transaction接口 --> (JDBCTransaction、ManageredTransaction)
   事务的部分主要还是靠spring来做的,这里并没有什么特殊的逻辑。


-----------8、binding模块 (基础支持)-------------------
1.模块出现的原由:mapper和mapper.xml的映射,假设在xml中有一个‘selectById’的方法,在mapper.java中写成了'selectById1',原来的mybatis是不会在初始化类的时候报错的,只有在真正使用这个方法的时候才会发现异常。  binding模块正是为了解决这个问题。
2. MapperRegistry。
   在mybatis初始化过程中会读取配置文件以及Mapper接口的注解信息,通过调用MapperRegistry.addMapper添加所有Mapper。
3.MapperProxy。
   mapper的代理类。
4.MapperMethod。
   mapper的方法对应的实体,包含SqlCommand、method两个属性,分别记录xml的sql信息和.java的method信息。


-----------9、缓存模块 (基础支持)-------------------
1、Cache接口 -->  PerpetualCache实现类 --> decorators包下的各种装饰器。
   缓存模块提供了很多cache的功能、如fifo、lru、命中率统计、按时间清除缓存、序列化、软引用、虚引用、同步、阻塞、事务缓存。
   
   * 装饰器模式,我们对一个类的功能有五花八门的需求,不同的需求是一堆小功能之间的胡乱组合,这时候使用装饰器模式,参照FileInputStream。
   * FileInputStream用read()读取文件时,会进行一次系统调用,由用户态切换到内核态,读取数据一个字节后,切换回用户态,然后再次调用,会频繁的切换上下文。BufferedOutputStream可以减少切换次数。

发布了88 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35946969/article/details/104160597