使用 yaml+groovy 实现 Java 代码可配置化 - JAVA - 编程开发
设为首页 加入收藏

TOP

使用 yaml+groovy 实现 Java 代码可配置化(一)
2018-01-09 06:06:35 】 浏览:494
Tags:使用 yaml groovy 实现 Java 代码 配置

背景与目标

使用函数接口和枚举实现配置式编程(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;
  }

  pub
编程开发网
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇一次 Maven 事故 下一篇深入Spring Boot:Spring Context..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目