MybatisPlus提供了一系列强大的拓展功能,在代码生成这块,更是可以利用freemarket制作出各种不同的模板,由于之前的模板是用的类似MP原始提供模板,仍然有很多地方不尽如,在配置某些自己工具类以及基础模块的时候,显得尤为僵硬和死板,因此开始了对其进行改造。
我们知道freemarket可以通过#{xxx},${xxxx}渲染对象变量的值. 正如下图所示,我们知道前面通常是项目的名字以及一些公司前缀,这些通常在一个很大项目中都是固定的,每次需要添加新的需求的时候,都可以利用代码生成器根据模板快速生成对应的基础服务.
既然有如此多的重复值,我们应该利用一些变量值.通过查阅官方生成器配置,可以看到com.baomidou.mybatisplus.generator.config.PackageConfig
我们有一些基础的变量信息是可以在这里配置的,对应的flt模板文件中是这样渲染的
**${package.Entity}**就是上面的Entity包名:“entity”.可是很明显,PackageConfig里面的字段太少太少,并不能满足我们的需求,因此,我们需要利用java的继承,对其进行拓展,那应该如何下手呢. 首先我们需要找到该模板引擎所渲染的字段最后到底是出自哪里的.
我们可以看到官方提供的代码生成器中,最后会通过 com.baomidou.mybatisplus.generator.AutoGenerator 中的execute方法,把我们设置的 pcakageConfig , GlobalConfig , DataSourceConfig , TemplateConfig等等我们配置好的模板信息一起set入通过execute()方法把参数带过去进行渲染.点开execute()方法可以看到我们之前 重点关注的 PackageConfig就在这里进行了传入 .
跟着走进去后,可以看到ConfigBuilder的构造函数,在红框圈住的这里把我们传入的包配置,调用了一个handlePackage的函数
接着跟入handlePackage( )函数中,可以看到这个packageInfo里mp的默认实现只是把红框中固定的几个参数传入,是写死的,并没有给我扩展字段的机会
而且仔细看,该方法和变量都是private的,符合“编译期可知,运行期不可变”这个要求的方法我们都是无法进行修改的。而且你通过继承ConfigBuilder会发现很多变量你不得不改写很多方法,改动很大,这个方案放弃了。
另一个方案,再次查看execute( )方法,发现config的信息注入模板是在templateEngin调用init方法的时候进行的,那我们是不是只要在init方法执行前把ConfigBuilder 中的 packageInfo(上文说的那个HashMap,与图中的packageInfo不是同一个对象!!)里面添加新的kv键值对就好了呢!
而且由于java是引用传递,利用这个特点,我们可以在execute先获取packageInfo的map,通过put操作,设置新的字段值,就可以达到修改了其他引用了该map的变量的内。
说干就干,首先通过继承AutoGenerator,选择重写public的execute方法,
具体操作如下:
@Data
public class MyBatisPlusGeneratorPackageConfig extends PackageConfig {
/**自定义字段设置项目名称*/
private String customPackage;
}
public class MybatisPlusAutoGeneratorExecuteEx extends AutoGenerator {
@Override
public void execute() {
logger.debug("==========================准备生成文件...==========================");
// 初始化配置
if (null == config) {
//这一块传入进去的是PackageConfig的子类,所以需要强制转换
MyBatisPlusGeneratorPackageConfig info = (MyBatisPlusGeneratorPackageConfig)super.getPackageInfo();
config = new ConfigBuilder(info,super.getDataSource(), super.getStrategy(),super.getTemplate(), super.getGlobalConfig());
Map<String, String> packageInfo = config.getPackageInfo();
packageInfo.put("CustomPackage",info.getCustomPackage());
if (null != injectionConfig) {
injectionConfig.setConfig(config);
}
}
AbstractTemplateEngine templateEngine = super.getTemplateEngine();
if (null == templateEngine) {
// 为了兼容之前逻辑,采用 Velocity 引擎 【 默认 】
templateEngine = new VelocityTemplateEngine();
}
// 模板引擎初始化执行文件输出
templateEngine.init(this.pretreatmentConfigBuilder(config)).mkdirs().batchOutput().open();
logger.debug("==========================文件生成完成!!!==========================");
}
}
MyBatisPlusGeneratorPackageConfig pc = new MyBatisPlusGeneratorPackageConfig();
pc.setCustomPackage("com.example.pro");
import ${package.CustomPackage}.constants.Constants;
import ${package.CustomPackage}.enums.StatusEnum;