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




Spring Boot是一个基于Spring框架的开发框架,可以快速构建Web应用程序和微服务。它提供了自动配置,使得应用程序的开发和部署变得非常简单和快速。 Redis是一个内存数据库,支持多种数据结构。其中之一就是集合,集合中可以存储字符串、列表、哈希等数据类型。Redis提供了生成随机数的方法,可以用于生成唯一标识符、验证码等。 在Spring Boot中使用Redis生成随机数的方法如下: 1. 添加Redis依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis连接 在application.properties文件中配置Redis连接信息: ``` spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= ``` 3. 编写代码 在代码中注入RedisTemplate类,使用opsForValue().setIfAbsent(key, value)方法生成随机数: ``` @Autowired private RedisTemplate<String, String> redisTemplate; public String generateRandomNumber(String key) { String randomNumber = ""; boolean isKeyExists = redisTemplate.opsForValue().setIfAbsent(key, "0"); if (isKeyExists) { redisTemplate.expire(key, 60, TimeUnit.SECONDS); randomNumber = String.valueOf((int)(Math.random() * 9000 + 1000)); redisTemplate.opsForValue().set(key, randomNumber); } else { randomNumber = redisTemplate.opsForValue().get(key); } return randomNumber; } ``` 上述代码中,首先判断Redis中是否存在指定的key,如果不存在则生成随机数并将其存入Redis中,设置过期时间为60秒。如果存在则从Redis中获取随机数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值