背景
最近在研究mapStruct,为了方便以后能顺手使用,本wiki将简单地走读一下源码。
源码走读
总览
源码下载:https://gitee.com/mirrors/mapstruct.git
pom模块概览
- parent,只有一个pom文件,用于全局统一加载工具,例如guava、freemarker等
- build-config,一些配置的xml集合
- core,各种注解和常量的定义与实现
- core-jdk8,基本没啥用。。
- distribution,配置maven打包的,主要用到了assembly(以后如果用到assembly,可以参考这里)
- documentation,文档相关,借助了maven,进行文档打包
- integrationtest,打包测试(暂时不在研究范围内)
- processor,注解处理器
重点:processor、core
processor
注意:在看processor之前需要先编译一下root,否则工程会爆红,因为有很多代码是在编译之后生成的
目录结构
先看下services的配置
- spi配置,运行时进行ioc加载用的
- apt,编译时执行
下面直接查看AbstractProcessor的继承。核心处理Mapper注解的类。
MappingProcessor的目标是遍历执行所有processor的process方法
processor列表如下
中间的解析和处理逻辑不一一赘述,这里直接看FreeMarkerWritable类
明显是借助了freemarker模板,进行代码生成,具体的模板名是和类名一一对应的。
现随便找一个,IterableCreation.ftl
与模板关联的是一个实现ModelElement接口的类,用于提供ftl的数据。ftl+数据,之后写入到指定的路径,即可进行代码生成。
core
在core的包里面主要就是对注解的和自定义类型的定义,只有少许的函数实现。
评价
- 有代码生成的需求,可以参考mapStruct的实现
- mapStruct中使用到了apt和spi技术,也是一个学习的模板
- freemarker物尽其用,也可以更多的进行参考