Mybatis基础支持层天空视角
2021-09-14 18:24:24 0 举报
Mybatis基础支持层上帝视角
作者其他创作
大纲/内容
sqlSession
基础支持层
数据源模块
接口DataSourceFactory
类UnpooledDataSourceFactory
类PooledDataSourceFactory
类JndiDataSourceFactory
数据源
类PooledDataSource实现DataSource接口
组合了类PoolState
组合了类PooledConnection集合
PooledConnection中封装真正的数据库连接对象
实现了InvocationHandler接口,动态代理了close方法,关闭时是把连接对象放回连接池
forceCloseAll方法
需要修改数据源配置重新建立连接时调用
关闭所有数据库连接
所有PooledConnection对象设置为无效
情况activeConnections集合和idleConnection集合
类UnpooledDataSource实现DataSource接口
静态代码块复制驱动信息到成员变量
initializeDriver初始化驱动
configureConnection事务是否自动提交、事务隔离级别配置
事务管理模块
接口Transaction
实现类JdbcTransaction
初始化数据源、事务隔离级别、事务提交方式
事务提交
事务回滚
实现类ManagedTransaction
事务的提交和回滚是空实现,是交给容器管理
接口TransactionFactory
实现类JdbcTransactionFactory
实现类实现类ManagedTransactionFactory
缓存模块
装饰器模式
接口Cache
实现类PerpetualCache-基本实现
实现类BlockingCache-阻塞版本的缓存装饰器
实现类FifoCache-先入先出的缓存装饰器
实现类LruCache-最近最少使用进行缓存清理的装饰器
实现类SoftCache
实现类WeakCache
类CacheKey
重写了equals和hashCode方法,使用count、checksum、hashcode、updateList比较CacheKey对象是否相同
Binding模块
类MapperRegistry
组合了类MapperProxyFactory
通过JDK动态代理创建代理对象
组合了类Configuration
所有配置信息会被解析成Configuration对象
addMapper方法
填充了MapperRegistry.knowMappers集合
key是Mapper接口对应的class对象,value为MapperProxyFactory工厂对象,可以为Mapper接口创建代理对象
getMapper方法
得到的是实现了Mapper接口的JDK动态代理对象
类MapperProxy
实现了InvocationHandler接口
invoke方法是代理对象执行的主要逻辑
cachedMapperMethod方法负责维护MethodCache这个缓存集合
类MapperMethod
组合了类SqlCommand
SqlCommand记录了SQL语句的名称和类型
SqlCommand是MapperMethod中定义的内部类
组合了类MethodSignature
Mapper接口中对应方法的相关信息
组合了类ParamNameResolver
处理Mapper接口中定义的方法的参数列表
names字段(SortedMap<Integer, String>类型)
记录了参数在参数列表中的位置索引与参数名称之间的对应关系
key是参数在参数列表中的索引位置,value是参数名称(可以用@Param注解指定)
MethodSignature是MapperMethod中定义的内部类
execute方法
执行INSERT、UPDATE、DELETE、SELECT、FLUSH操作
INSERT、UPDATE、DELETE类型需要经过rowCountResult方法处理影响行数
反射模块
反射工具箱用于参数处理、结果映射
类Reflector
构造方法指定了要解析的Class对象
处理getter、setter方法
处理父子类方法重写冲突
处理字段
接口ReflectorFactory
实现类DefaultReflectorFactory用于Reflector接口的创建和缓存
接口ReflectorFactory
实现类DefaultReflectorFactory用于Reflector接口的创建和缓存
接口ReflectorFactory
实现类DefaultReflectorFactory用于Reflector接口的创建和缓存
类TypeParameterResolver
处理字段、方法、变量的类型信息
类TypeParameterResolver
处理字段、方法、变量的类型信息
类TypeParameterResolver
处理字段、方法、变量的类型信息
接口ObjectFactory
类DefaultObjectFactory中的create方法通过反射调用构造方法的方式实例化对象
接口ObjectFactory
类DefaultObjectFactory中的create方法通过反射调用构造方法的方式实例化对象
接口ObjectFactory
类DefaultObjectFactory中的create方法通过反射调用构造方法的方式实例化对象
Property工具集
PropertyTokenizer 解析属性表达式,实现了Iterator接口
PropertyNamer 方法名到属性名的转换
PropertyCopier 相同类型的两个对象之间属性值的拷贝
类MetaClass 使用Reflector和PropertyTokenizer对复杂属性表达式的解析,获取指定属性的描述信息
接口ObjectWrapper
对象级别的元信息的处理,是对对象级别的封装,抽象了对象的属性信息
ObjectWrapperFactory负责创建ObjectWrapper
类MetaObject
类型转换
接口TypeHandler
setParameter 负责将数据由JdbcType转换成Java
getResult负责将数据由Java类型转换成JdbcType类型
接口实现的抽象类BaseTypeHandler,把非空数据的处理都交给了子类实现
类TypeHandlerRegistry用于类型处理器的注册
类TypeAliasRegistry 别名注册
日志模块
适配器模式实现多日志框架的切换
代理模式实现日志的打印-jdk动态代理
BaseJdbcLogger
ConnectionLogger
PreparedStatementLogger
ResultSetLogger
StatementLogger
资源加载
类加载器
Bootstrap ClassLoader负责加载JDK中的rt.jar
Extentsion ClassLoader负责加载jre/lib/ext中的jar包
System ClassLoader负责从classpath环境变量中加载类文件
Tomcat的类加载器
CommonClassLoader继承自System ClassLoader
CatalinaLoader和ShareLoader两个类加载器的父类都是CommonClassLoader
Tomcat会为每个部署的应用创建一个唯一的类加载器WebAppClassLoader,多应用之间互相隔离
双亲委派模式 自底向上检测类是否已经加载、自顶向下尝试加载类
开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器
mybatis类加载器ClassLoaderWrapper
getResourceAsURL
classForName
getResourceAsStream
工具类ResolverUtil 根据指定的条件查找指定包下的类
单例模式
抽象类VFS虚拟文件系统
作用:查找指定路径下的资源
JBoss6VFS
DefaultVFS
解析器模块
Dom+XPath解析xml文件
类XPathParser封装了XPath、Document、EntityResolver
接口TokenHandler处理占位符
Mybatis核心处理层
配置解析
建造者模式
抽象类BaseBuilder-建造者接口
子类SqlSourceBuilder
子类XMLStatementBuilder-具体建造者C
接口SqlSource表示映射文件或注解中定义的SQL语句
类MappedStatement表示映射配置文件中定义的SQL节点
解析include节点 将include节点替换成sql节点中定义的SQL片段,占位符替换成真实参数
方法processSelectKeyNodes负责解析selectKey节点
在insert、update节点中可以定义selectKey节点来解决主键自增问题
selectKey节点对应的KeyGenerator接口用于生成主键
先创建SqlSource对象后创建MappedStatement对象并添加到Configuration.mappedStatements集合中保存
解析SQL节点
绑定Mapper接口
每个映射配置文件的命名空间可以绑定一个Mapper接口并注册到MapperRegistry中
处理incomplete*集合
XMLMapperBuilder.configurationElement()解析映射配置文件时引用到还未解析的节点就会解析失败并抛出异常
incompleteMethods集合
incompleteResultMaps集合
incompleteCacheRefs集合
incompleteStatements集合
XMLMapperBuilder.configurationElement()解析完成后还会调用parsePendingResultMaps、parsePendingCacheRefs、parsePendingStatements方法处理incomplete*集合
子类XMLMapperBuilder-具体建造者B
组合了类MapperBuilderAssistant
方法useNewCache负责创建Cache对象并添加到Configuration.caches集合保存(StrictMap<Cache>类型)
方法parse解析映射文件
解析cache节点
解析cache-ref节点
解析parameterMap节点-官网已标记废弃
解析resultMap节点
解析sql节点-依赖XMLStatementBuilder解析
子类XMLConfigBuilder-具体建造者A
方法parse负责解析mybatis-config.xml
解析properties节点并设置到XPathParser和Configuration的variables字段中
解析settings节点并设置到Configuration对象的对应属性中
解析typeAliases、typeHandlers节点并通过TypeAliasesRegistry、TypeHandlersRegistry进行注册
解析plugins节点并放入Configuration的拦截器链中
解析objectFactory节点并放入Configuration
解析environments节点并放入Configuration
解析databaseIdProvider节点并放入Configuration
解析mappers节点,依赖XMLMapperBuilder对象加载映射文件
子类MapperBuilderAssistant
子类ParameterMappingTokenHandler
子类XMLScriptBuilder
组合了类Configuration、TypeAliasRegistry、TypeHandlerRegistry
方法resolveAlias依赖TypeAliasRegistry解析别名
方法resolveTypeHandler依赖TypeHandlerRegistry查找指定的TypeHandler对象
方法resolveJdbcType
方法resolveResultSetType
方法resolveParameterMode
参数映射
SQL解析
SQL执行
结果集映射
插件
0 条评论
下一页