【Spring Boot】(5)、配置文件的随机数和占位符

原创 2018年04月16日 22:47:29

Spring Boot全局配置文件中支持使用随机数和占位符的方式进行添加属性。

1、随机数

  • ${random.value}

  • ${random.int}

  • ${random.int(max)}

  • ${random.int(min,max)}

  • ${random.long}

  • ${random.long(max)}

  • ${random.long(min,max)}

  • ${random.uuid}

随机数使用的是RandomValuePropertySource类进行解析。注意:在使用IDEA进行随机数配置的时候,不会提示long的第二种和第三种随机数使用方式,博主也是在看RandomValuePropertySource才发现的。

public class RandomValuePropertySource extends PropertySource<Random> {

	/**
	 * Name of the random {@link PropertySource}.
	 */
	public static final String RANDOM_PROPERTY_SOURCE_NAME = "random";

	private static final String PREFIX = "random.";

	private static final Log logger = LogFactory.getLog(RandomValuePropertySource.class);

	public RandomValuePropertySource(String name) {
		super(name, new Random());
	}

	public RandomValuePropertySource() {
		this(RANDOM_PROPERTY_SOURCE_NAME);
	}

	@Override
	public Object getProperty(String name) {
		if (!name.startsWith(PREFIX)) {
			return null;
		}
		if (logger.isTraceEnabled()) {
			logger.trace("Generating random property for '" + name + "'");
		}
		return getRandomValue(name.substring(PREFIX.length()));
	}

	private Object getRandomValue(String type) {
		if (type.equals("int")) {//${random.int}
            //getSource()返回的是泛型T的实际对象,所以nextInt()也就是调用Random类的nextInt()方法
			return getSource().nextInt();
		}
		if (type.equals("long")) {//${random.long}
			return getSource().nextLong();
		}
		String range = getRange(type, "int");
		if (range != null) {
			return getNextIntInRange(range);
		}
		range = getRange(type, "long");
		if (range != null) {
			return getNextLongInRange(range);
		}
		if (type.equals("uuid")) {//${random.uuid}
			return UUID.randomUUID().toString();
		}
		return getRandomBytes();//${random.value}
	}

	private String getRange(String type, String prefix) {
		if (type.startsWith(prefix)) {
			int startIndex = prefix.length() + 1;
			if (type.length() > startIndex) {
				return type.substring(startIndex, type.length() - 1);
			}
		}
		return null;
	}

	private int getNextIntInRange(String range) {
		String[] tokens = StringUtils.commaDelimitedListToStringArray(range);
		int start = Integer.parseInt(tokens[0]);
		if (tokens.length == 1) {//${random.int(value)}
			return getSource().nextInt(start);
		}
        //${random.int(value,max)}
		return start + getSource().nextInt(Integer.parseInt(tokens[1]) - start);
	}

	private long getNextLongInRange(String range) {
		String[] tokens = StringUtils.commaDelimitedListToStringArray(range);
		if (tokens.length == 1) {//${random.long(value)}
			return Math.abs(getSource().nextLong() % Long.parseLong(tokens[0]));
		}
		long lowerBound = Long.parseLong(tokens[0]);
		long upperBound = Long.parseLong(tokens[1]) - lowerBound;
        //${random.long(value,max)}
		return lowerBound + Math.abs(getSource().nextLong() % upperBound);
	}

	private Object getRandomBytes() {
		byte[] bytes = new byte[32];
		getSource().nextBytes(bytes);
        //${random.value}
		return DigestUtils.md5DigestAsHex(bytes);
	}

	//...
}

        博主有一个习惯,就是如果在标点符号后面还有变量啥的,都喜欢在标点符号后面多敲一个空格,方便查看,也保持排版的整洁。在使用${random.int(min,max)}的时候就喜欢敲成${random.int(min, max)},注意逗号和max之间有个空格。当博主写了一个变量${random.long(20000, 99999)},在调试的时候,发现在解析的时候老是报错,后来看异常的时候,才发现无法解析“ 99999”,原来逗号和max之间不能写空格,真是个坑啊!!!

注意点:凡是有写min和max两个value的random,min和max之间不能有空格,只能是逗号,不然在源码解析的时候解析不了,会报异常。如:${random.int(100,200)}是正确的,而${random.int(100, 200)}是错误的,请一定要注意,防止入坑!!!


   

2、占位符

可以引用之前的属性值,如果没有则可以使用默认值。例如:${aaa: default},如果 ${aaa}不存在,则使用default代替aaa的值;如果${aaa}存在,则使用${aaa}的值。


a = ${random.int}
b = ${random.int(100)}
c = ${random.int(500,1000)}
d = ${random.long}
e = ${random.long(10000)}
f = ${random.long(20000,99999)}
g = ${random.value}
h = ${random.uuid}
i = ${aaa:"bbb"}

在解析占位符的时候,例如有个变量i = ${aaa:"bbb"},在引用i变量的时候,会先解析i的值,然后在解析${aaa:"bbb"}的值,接着又解析${aaa}的值,如果存在,则直接使用aaa变量的值,如果不存在,则直接使用"bbb"作为a变量的值,实际上是一种递归解析




====================打个广告,欢迎关注====================

QQ:
412425870
微信公众号:Cay课堂

csdn博客:
http://blog.csdn.net/caychen
码云:
https://gitee.com/caychen/
github:
https://github.com/caychen

点击群号或者扫描二维码即可加入QQ群:

328243383(1群)




点击群号或者扫描二维码即可加入QQ群:

180479701(2群)




版权声明:本文为博主原创文章,未经博主允许不得转载。请联系博主或者emailTo:412425870@qq.com,谢谢! https://blog.csdn.net/caychen/article/details/79967979

Spring Boot系列教程四:配置文件详解properties

一.配置随机数,使用随机数 在application.properties文件添加配置信息 #32位随机数 woniu.secret=${random.value} #随机整数 woniu.numb...
  • woniu211111
  • woniu211111
  • 2017-01-08 17:53:59
  • 14244

第六章:SpringBoot配置(配置文件占位符)

总目录:SpringBoot学习教程(一):在SpringBoot的配置文件中,我们可以使用SpringBoot提供的的一些随机数${random.value}、${random.int}、${ran...
  • baidu_36216018
  • baidu_36216018
  • 2018-03-18 09:55:57
  • 109

Spring配置文件使用占位符配置

classpath:jdbc.properties
  • u013250327
  • u013250327
  • 2014-07-04 17:41:03
  • 3667

Spring Boot学习--从配置文件中获取随机数

废话少说,直入正题,从配置文件中获取符合规则的随机数。在配置文件中直接加入以下代码,我放到application.properties中的:my.secret=${random.value} my.n...
  • qq_35981283
  • qq_35981283
  • 2017-09-05 16:30:35
  • 810

2、spring-boot 工程配置——配置文件详解:自定义属性、随机数、多环境配置等

相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷。我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁...
  • wanbf123
  • wanbf123
  • 2017-06-01 13:41:48
  • 1006

spring boot 下多环境配置占位符无法使用

spring boot 下多环境配置占位符无法使用环境
  • u013451048
  • u013451048
  • 2017-09-08 11:09:43
  • 732

spring配置文件<import>标签中使用${}占位符获得配置文件的属性值

一般情况下我们在Spring的配置文件中使用标签是这样的,,但是最近项目中使用到其他工程的依赖jar包,在自己的spring配置文件中需要这样写 其中env的值是从eoa_config.pr...
  • z69183787
  • z69183787
  • 2016-12-01 16:29:31
  • 2111

spring boot配置文件参数详解

  • 2018年03月26日 13:34
  • 15KB
  • 下载

spring boot实战(第四篇)分散配置

spring boot实战(第四篇)分散配置前言分散配置是系统必不可少的一部分,将配置参数抽离出来为后期维护提供很大的便利。spring boot 默认支持两个格式的配置文件:.properties ...
  • liaokailin
  • liaokailin
  • 2015-09-13 23:38:29
  • 13874

spring的启动过程03.1-占位符替换过程-xml配置的参数

概述: 在上篇的《spring的启动过程03-工厂后置处理器》文章中讲解了工厂后置处理器的原理,这篇文章将会结合具体的功能详细讲解占位符的替换过程。 spring的实际使用过程中会有两个地方用到占位符...
  • qq_28580959
  • qq_28580959
  • 2016-12-29 13:39:54
  • 348
收藏助手
不良信息举报
您举报文章:【Spring Boot】(5)、配置文件的随机数和占位符
举报原因:
原因补充:

(最多只允许输入30个字)