1、简介
在现实的开发中,我们会有很多重复性代码,为了避免重复性开发,使用模板引擎自动生成代码,类似于mybatis-generator工具,能够节省很多精力写重复性代码。
2、引入freemarker依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
3、使用freemarker生成代码
3.1、建立模板
以java代码为例,使用 ${} 定义变量,文件名为 test.ftl(注意文件格式)。
package com.test.${module};
public class ${Domain}{
@Override
public String toString() {
return "${Domain}{" +
"} " + super.toString();
}
}
3.2、freemarker生成核心代码
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.*;
import java.util.Map;
public class FreemarkerUtil {
static String ftlPath = "./ftl/";
static Template template;
public static void initConfig(String ftlName) throws IOException {
// 输入ftl文件,获取ftl模板
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File(ftlPath));
cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_31));
template = cfg.getTemplate(ftlName);
}
public static void generator(String fileName, Map<String, Object> map) throws IOException, TemplateException {
// 生成代码
FileWriter fw = new FileWriter(fileName);
BufferedWriter bw = new BufferedWriter(fw);
template.process(map, bw);
bw.flush();
fw.flush();
}
}
3.3、生成 Test.java 代码
import freemarker.template.TemplateException;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class ServerGenerator {
static String serverPath = "[module]/src/main/java/com/[module]/";
static String module = "";
public static void main(String[] args) throws Exception {
serverPath = serverPath.replace("[module]", "test");
new File(serverPath).mkdirs();
System.out.println("servicePath: " + serverPath);
// 组装参数
Map<String, Object> param = new HashMap<>();
// map里面的key是在ftl文件中定义的变量名
param.put("module", "testjava");
param.put("Domain", "Test");
gen(param, "testjava", "test");
}
private static void gen( Map<String, Object> param, String packageName, String target) throws IOException, TemplateException {
FreemarkerUtil.initConfig(target + ".ftl");
String toPath = serverPath + packageName + "/";
new File(toPath).mkdirs();
String Target = target.substring(0, 1).toUpperCase() + target.substring(1);
// 生成java文件到指定目录
String fileName = toPath + Target + ".java";
System.out.println("开始生成:" + fileName);
FreemarkerUtil.generator(fileName, param);
}
}
4、总结
本文只是利用freemarker做一个简单的案例,关于freemarker的使用流程就是这么多,关于更加复杂的代码生成逻辑还需要对freemarker的语法进行系统学习,掌握freemarker可以生成重复性代码,提高工作效率。
本人是一个从小白自学计算机技术,对前端、运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)