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

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群)




猜你喜欢

转载自blog.csdn.net/caychen/article/details/79967979