MyBatis 源码分析 - 配置文件解析过程 (10)

在这两步流程中,第2步流程对应的代码上一节已经分析过了,这里不再赘述。第1步的功能理解起来不难,但是背后对应的代码有点多。限于篇幅原因,这里我不打算详细分析这一部分的代码,只做简单的流程总结。如下:

通过 VFS(虚拟文件系统)获取指定包下的所有文件的路径名,
比如xyz/coolblog/model/Article.class

筛选以.class结尾的文件名

将路径名转成全限定的类名,通过类加载器加载类名

对类型进行匹配,若符合匹配规则,则将其放入内部集合中

以上就是类型资源查找的过程,并不是很复杂,大家有兴趣自己看看吧。

2.5.3 注册 MyBatis 内部类及常见类型的别名

最后,我们来看一下一些 MyBatis 内部类及一些常见类型的别名注册过程。如下:

// -☆- Configuration public Configuration() { // 注册事务工厂的别名 typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); // 省略部分代码,下同 // 注册数据源的别名 typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class); // 注册缓存策略的别名 typeAliasRegistry.registerAlias("FIFO", FifoCache.class); typeAliasRegistry.registerAlias("LRU", LruCache.class); // 注册日志类的别名 typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class); typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class); // 注册动态代理工厂的别名 typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class); typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class); } // -☆- TypeAliasRegistry public TypeAliasRegistry() { // 注册 String 的别名 registerAlias("string", String.class); // 注册基本类型包装类的别名 registerAlias("byte", Byte.class); // 省略部分代码,下同 // 注册基本类型包装类数组的别名 registerAlias("byte[]", Byte[].class); // 注册基本类型的别名 registerAlias("_byte", byte.class); // 注册基本类型包装类的别名 registerAlias("_byte[]", byte[].class); // 注册 Date, BigDecimal, Object 等类型的别名 registerAlias("date", Date.class); registerAlias("decimal", BigDecimal.class); registerAlias("object", Object.class); // 注册 Date, BigDecimal, Object 等数组类型的别名 registerAlias("date[]", Date[].class); registerAlias("decimal[]", BigDecimal[].class); registerAlias("object[]", Object[].class); // 注册集合类型的别名 registerAlias("map", Map.class); registerAlias("hashmap", HashMap.class); registerAlias("list", List.class); registerAlias("arraylist", ArrayList.class); registerAlias("collection", Collection.class); registerAlias("iterator", Iterator.class); // 注册 ResultSet 的别名 registerAlias("ResultSet", ResultSet.class); }

我记得以前配置<select/>标签的resultType属性,由于不知道有别名这回事,傻傻的使用全限定类名进行配置。当时还觉得这样配置一定不会出错吧,很放心。现在想想有点搞笑。

好了,以上就是别名解析的全部流程,大家看懂了吗?如果觉得没啥障碍的话,那继续往下看呗。

2.6 解析 plugins 配置

插件是 MyBatis 提供的一个拓展机制,通过插件机制我们可在 SQL 执行过程中的某些点上做一些自定义操作。实现一个插件需要比简单,首先需要让插件类实现Interceptor接口。然后在插件类上添加@Intercepts和@Signature注解,用于指定想要拦截的目标方法。MyBatis 允许拦截下面接口中的一些方法:

Executor: update 方法,query 方法,flushStatements 方法,commit 方法,rollback 方法, getTransaction 方法,close 方法,isClosed 方法

ParameterHandler: getParameterObject 方法,setParameters 方法

ResultSetHandler: handleResultSets 方法,handleOutputParameters 方法

StatementHandler: prepare 方法,parameterize 方法,batch 方法,update 方法,query 方法

比较常见的插件有分页插件、分表插件等,有兴趣的朋友可以去了解下。本节我们来分析一下插件的配置的解析过程,先来了解插件的配置。如下:

<plugins> <plugin interceptor="xyz.coolblog.mybatis.ExamplePlugin"> <property value="value"/> </plugin> </plugins>

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

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