• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详解Spring Boot 自定义PropertySourceLoader

详解Spring Boot 自定义PropertySourceLoader

作者:catoop 字体:[增加 减小] 来源:互联网 时间:2017-05-28

catoop 通过本文主要向大家介绍了spring boot注解详解,spring boot详解,spring配置文件详解,spring注解详解,spring aop详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

SpringBoot 的配置文件内置支持 properties、xml、yml、yaml 几种格式,其中 properties和xml 对应的Loader类为 PropertiesPropertySourceLoader ,yml和yaml 对应的Loader类为 YamlPropertySourceLoader。

观察这2个类可以发现,都实现自接口 PropertySourceLoader 。所以我们要新增支持别的格式的配置文件,就可以通过实现接口 PropertySourceLoader 来实现了。

下面实现了一个 json 格式的配置文件 Loader类:

package com.shanhy.sboot.property;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.springframework.boot.env.PropertySourceLoader;
import org.springframework.boot.json.JsonParser;
import org.springframework.boot.json.JsonParserFactory;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;

/**
 * JSON格式配置文件加载器
 * 
 * @author 单红宇(CSDN CATOOP)
 * @create 2017年4月20日
 */
public class JsonPropertySourceLoader implements PropertySourceLoader {

  public String[] getFileExtensions() {
    // 配置文件格式(扩展名)
    return new String[] { "json" };
  }

  public PropertySource<?> load(String name, Resource resource, String profile) throws IOException {
    // 处理机制参考PropertiesPropertySourceLoader
    // 无论profile有没有值,底层都会尝试先执行 load(String name, Resource resource, null),所以这个地方之间判断等于null即可。
    // 当前版本springboot-1.5.2(后续版本未知)详见 ConfigFileApplicationListener 的 445 行
    if (profile == null) {
      Map<String, Object> result = mapPropertySource(resource);
      return new MapPropertySource(name, result);
    }
    return null;
  }

  /**
   * 解析Resource为Map
   *
   * @param resource
   * @return
   * @throws IOException
   * 
   * @author 单红宇(CSDN CATOOP)
   * @create 2017年4月20日
   */
  private Map<String, Object> mapPropertySource(Resource resource) throws IOException {
    if (resource == null) {
      return null;
    }
    Map<String, Object> result = new HashMap<String, Object>();
    JsonParser parser = JsonParserFactory.getJsonParser();
    Map<String, Object> map = parser.parseMap(readFile(resource));
    nestMap("", result, map);
    return result;
  }

  /**
   * 读取Resource文件内容为字符串
   *
   * @param resource
   * @return
   * @throws IOException
   * 
   * @author 单红宇(CSDN CATOOP)
   * @create 2017年4月20日
   */
  private String readFile(Resource resource) throws IOException {
    InputStream inputStream = resource.getInputStream();
    List<Byte> byteList = new LinkedList<Byte>();
    byte[] readByte = new byte[1024];
    int length;
    while ((length = inputStream.read(readByte)) > 0) {
      for (int i = 0; i < length; i++) {
        byteList.add(readByte[i]);
      }
    }
    byte[] allBytes = new byte[byteList.size()];
    int index = 0;
    for (Byte soloByte : byteList) {
      allBytes[index] = soloByte;
      index += 1;
    }
    return new String(allBytes, "UTF-8");
  }

  /**
   * 处理map(map中可能还嵌套map,递归处理),最终输出一个非嵌套的map
   *
   * @param prefix
   *      前缀
   * @param result
   *      处理后的map
   * @param map
   *      处理前的map
   * 
   * @author 单红宇(CSDN CATOOP)
   * @create 2017年4月20日
   */
  @SuppressWarnings("unchecked")
  private void nestMap(String prefix, Map<String, Object> result, Map<String, Object> map) {
    if (prefix.length() > 0) {
      prefix += ".";
    }
    for (Map.Entry<String, Object> entrySet : map.entrySet()) {
      if (entrySet.getValue() instanceof Map) {
        nestMap(prefix + entrySet.getKey(), result, (Map<String, Object>) entrySet.getValue());
      } else {
        result.put(prefix + entrySet.getKey().toString(), entrySet.getValue());
      }
    }
  }
}

</div>

然后在 src/main/resources 中创建 META-INF/spring.factories 文件,内容为:

org.springframework.boot.env.PropertySourceLoader=\
com.shanhy.sboot.property.JsonPropertySourceLoader
</div>

创建测试的配置文件 application.json

{
  "custom": {
    "property": {
      "message": "测试数据"
    }
  }
}
</div>

创建验证结果的 HelloController.Java

@RestController
public class HelloController {

  @Value("${custom.property.message:}")
  private String customProperty;

  @RequestMapping("/test")
  public String test() {
    return customProperty;
  }
}
</div>

启动工程服务,浏览器访问 http://localhost:8080/test 即可查看输出的结果为 “测试数据”;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解Spring boot上配置与使用mybatis plus
  • 详解Spring Boot中Controller用法
  • 详解Spring Boot 定时任务的实现方法
  • 详解在Spring Boot中使用数据库事务
  • spring boot整合CAS配置详解
  • Spring Boot Redis 集成配置详解
  • 详解Spring Boot集成MyBatis(注解方式)
  • Spring Boot的Profile配置详解
  • 详解spring boot配置 ssl
  • spring boot 的常用注解使用小结

相关文章

  • 2017-05-28Spring Boot 基于注解的 Redis 缓存使用详解
  • 2017-05-28SpringMVC表单标签使用详解
  • 2017-05-28Java接口的作用_动力节点Java学院整理
  • 2017-05-28详解springboot配置多个redis连接
  • 2017-05-28Java进阶学习:jar打包详解
  • 2017-05-28java三层架构原理与作用小结
  • 2017-05-28Java计算两个程序运行时间的实例
  • 2017-05-28java中Serializable接口作用详解
  • 2017-05-28java基于dom4j包实现对XML解析的方法
  • 2017-05-28Java Socket编程(四) 重复和并发服务器

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解SpringMVC注解版前台向后台传值的两种方式
    • SpringBoot配置devtools实现热部署的方法
    • java加载properties文件的六种方法总结
    • SpringBoot拦截器的使用小结
    • java图形验证码生成工具类 web页面校验验证码
    • java 中HashMap实现原理深入理解
    • java web中 HttpClient模拟浏览器登录后发起请求
    • SpringBoot(十)之邮件服务
    • kotlin基础教程之类和继承
    • 详解使用Spring3 实现用户登录以及权限认证

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有