阅读指南
mbg 项目地址: https://github.com/mybatis/generator.git
mbg的用途:自动生成mybatis相关的数据访问代码,包括 java、xml、kotlin。
mbg的用法:目前支持通过ant task、maven 插件、java -jar三种形式调用mbg进行代码生成。
本文介绍mabatis generator core的代码结构和执行逻辑。
源码下载后分成两个大项目,core和eclipse,本文介绍的是core项目的一个子工程,即下图红框中的内容。
Basic Concept 和 包结构介绍
MyBatisGenerator
项目的主类,它本质上是执行mbg任务的入口,ant、maven、java -jar都调用MyBatisGenerator。
GeneratorAntTask
ant task的调用入口,它把MyBatisGenerator适配成ant task接口的形式,然后向外暴露。
MyBatisGeneratorMojo
maven插件的调用入口,它把MyBatisGenerator适配成插件的形式,然后向外暴露给maven使用。
ShellRunner
jvm的调用入口,它把MyBatisGenerator适配成java main接口的形式,然后向外暴露给jvm执行。
Configuration
与其说成configuration,不如说是arguments。它是传递给MyBatisGenerator的外部参数,对应的是xml参数配置,无论是ant、maven、还是java shell,都需要向mbg提供这个信息。
Context
一个独立的任务描述,它对应了Configuration xml文件中的<Context/>标签,一个<generatorConfiguration>可以有多个<Context/>标签,执行多个任务。mbg生成代码的过程,是以Context为单位的。
AbstractGenerator
文件生成器,最顶层的抽象类,不负责任何具体的代码生成。它有很多子类负责执行具体的代码生成和提供相关接口,例如JavaMapperGenerator、SimpleXMLMapperGenerator、KotlinDataClassGenerator。仅Java class的generator就有xml、annotation、mixed多种形式。如果你想开发新的特性,可以在这个继承树中扩展。
Plugin
这里的插件不是maven插件,而是给代码生成器generator使用的插件。generator通过组合使用不同的plugin来产生不同的效果。编写插件是第二种开发新特性的方式。
dom
以面向对象形式提供的,对代码文件(java、xml、kotlin)的描述。它屏蔽了将内容写入文件的具体细节,使得开发人员可以以面向对象的形式来描述要生成的文件内容。
包结构介绍
有了上面的概念,再来看项目的包结构就很清楚了。
ant包是ant调用入口
api包是各种接口定义和mybatisGenerator入口等
codegen是代码生成逻辑,即上面提到的generator继承树
config 解析xml参数
plugins 插件,generator使用的插件
代码调用逻辑
从mybatisGenerator的generate方法看起就可以了。
基本流程是:
1、把xml参数解析成configuration
2、设置一些callback回调(和主逻辑相关性不大,例如进度显示之类的)
3、进入mybatisGenerator的主入口
4、依次执行每个context任务,将生成的文件内容保存
5、把生成的文件写入磁盘
而context的执行则是调用了不同的generator,generator又会用到plugin
end