配景与方针
在利用函数接口和列举实现设置式编程(Java与Scala实现),利用了函数接口和列举实现了设置式编程。读者可先阅读此文,再来阅读本文。
有时,需要将一些业务逻辑,利用设置化的方法抽离出来,供业务专家或外部人员来编辑和修改。这样,就需要将一些代码用剧本的方法实现。在Java语言体系中,与Java粘合较量细密的是Groovy语言,本例中,将利用Groovy实现Java代码的可设置化。
方针: 指定字段荟萃,可输出指定工具的相应字段的值。实现可设置化方针。
设计思路
利用groovy的语法和剧本实现相应成果,然后集成到Java应用中。
实现
本文的示例代码都可以在工程 https://github.com/shuqin/ALLIN 下的包 zzz.study.groovy 下找到并运行。 记得安装 lombok 插件以及调解运行时到Java8。
依赖JAR包
本文依赖如下Jar包:groovy-all, fastjson, yamlbeans, lombok ,以及 Java8 (函数语法)
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.12</version>
</dependency>
<dependency>
<groupId>com.esotericsoftware.yamlbeans</groupId>
<artifactId>yamlbeans</artifactId>
<version>1.09</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.36</version>
</dependency>
从剧本开始
要实现可设置化,显然要举办字段界说。 简朴起见,字段凡是包括三个要素: 标识、标题、字段逻辑。 回收 yaml + groovy 的方法来实现。放在 src/main/resources/scripts/ 下。 如下所示:
name: studentId title: 学生编号 script: | stu.studentId
name: studentName title: 学生姓名 script: | stu.name
name: studentAble title: 拿手 script: | stu.able
字段设置的界说类 :
package zzz.study.groovy;
import lombok.Data;
/**
* Created by shuqin on 17/11/22.
*/
@Data
public class ReportFieldConfig {
/** 报表字段标识 */
private String name;
/** 报表字段标题 */
private String title;
/** 报表字段逻辑剧本 */
private String script;
}
设置理会
接下来,需要编写设置理会器,将设置文件内容加载到内存,劳务派遣管理系统,成立字段映射。 设置化的焦点,实际就是成立映射干系。
YamlConfigLoader 实现了单个设置内容的理会。
package zzz.study.groovy;
import com.alibaba.fastjson.JSON;
import com.esotericsoftware.yamlbeans.YamlReader;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by yuankui on 17/6/13.
*/
public class YamlConfigLoader {
public static ReportFieldConfig loadConfig(String content) {
try {
YamlReader reader = new YamlReader(content);
Object object = reader.read();
return JSON.parseObject(JSON.toJSONString(object), ReportFieldConfig.class);
} catch (Exception e) {
throw new RuntimeException("load config failed:" + content, e);
}
}
public static List<ReportFieldConfig> loadConfigs(List<String> contents) {
return contents.stream().map(YamlConfigLoader::loadConfig).collect(Collectors.toList());
}
}
YamlConfigDirLoader 从指定目次下加载所有设置文件,并利用 YamlConfigLoader 成立所有字段的映射干系。实际工程应用中,凡是是将设置生存在DB中,并从DB里读取设置。
package zzz.study.groovy;
import org.springframework.util.StreamUtils;
import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by shuqin on 17/11/23.
*/
public class YamlConfigDirLoader {
private String dir;
public YamlConfigDirLoader(String dir) {
this.dir = dir;
}
public List<ReportFieldConfig> loadConfigs() {
File[] files = new File(dir).listFiles();
return Arrays.stream(files).map(
file -> {
try {
String
content =
StreamUtils.copyToString(new FileInputStream(file), Charset.forName("utf-8"));
return YamlConfigLoader.loadConfig(content);
} catch (java.io.IOException e) {
System.err.println(e.getMessage());
throw new RuntimeException(e);
}
}
).collect(Collectors.toList());
}
}