欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

利用 yaml+groovy 实 劳务派遣信息管理系统 现 Java 代码可设置化

点击: 次  来源:劳务派遣管理系统 时间:2018-01-08

原文出处: 琴水玉

配景与方针

在利用函数接口和列举实现设置式编程(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());
  }

}