Java-SpringBoot-06-随机数及自动给配置随机赋值

简介: SpringBoot中提供了一个随机值属性源RandomValuePropertySource可以给配置文件自动赋值随机数

一、SpringBoot内置自动给配置赋值随机数

1.在application.properties中添加以下配置:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int [1024,65536]}

2.类中直接注入配置

packagecom.xing.studyboot.rest.controller;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
/***  查看配置* @author xing* @createTime*/@RestControllerpublicclassShowValueController {
//  @Value(value="${local.server.port}")//  private String localServerPort;//  //  @Value(value="${spring.application.admin.enabled}")//  private String springApplicationAdminEnabled;@Value(value="${my.secret}")
privateStringmySecret;
@Value(value="${my.number}")
privateStringmyNumber;
@Value(value="${my.bignumber}")
privateStringmyBignumber;
@Value(value="${my.uuid}")
privateStringmyUUid;
@Value(value="${my.number.less.than.ten}")
privateStringmyNumberLessThanTen;
@Value(value="${my.number.in.range}")
privateStringmyNumberInRange;
@RequestMapping(value="/showSome")
publicStringindex() {
StringBuilderstr=newStringBuilder();
//    str.append("本地端口local.server.port->"+localServerPort);//    str.append("spring.application.admin.enabled->"+springApplicationAdminEnabled);str.append("my.secret->"+mySecret+"<br/>");
str.append("my.number->"+myNumber+"<br/>");
str.append("my.bignumber->"+myBignumber+"<br/>");
str.append("my.uuid->"+myUUid+"<br/>");
str.append("my.number.less.than.ten->"+myNumberLessThanTen+"<br/>");
str.append("my.my.number.in.range->"+myNumberInRange+"<br/>");
returnstr.toString();
  }
}

访问查看发现已自动生成了随机配置:

image.png

二、RandomValuePropertySource

1.源码

image.png

通过查看源码,可以看到我们只要传入不同类型的枚举name,即可获得name对应类型的随机数

/** Copyright 2012-2020 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/packageorg.springframework.boot.env;
importjava.util.Random;
importjava.util.UUID;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importorg.springframework.core.env.ConfigurableEnvironment;
importorg.springframework.core.env.MutablePropertySources;
importorg.springframework.core.env.PropertySource;
importorg.springframework.core.env.StandardEnvironment;
importorg.springframework.core.log.LogMessage;
importorg.springframework.util.DigestUtils;
importorg.springframework.util.StringUtils;
/*** {@link PropertySource} that returns a random value for any property that starts with* {@literal "random."}. Where the "unqualified property name" is the portion of the* requested property name beyond the "random." prefix, this {@link PropertySource}* returns:* <ul>* <li>When {@literal "int"}, a random {@link Integer} value, restricted by an optionally* specified range.</li>* <li>When {@literal "long"}, a random {@link Long} value, restricted by an optionally* specified range.</li>* <li>Otherwise, a {@code byte[]}.</li>* </ul>* The {@literal "random.int"} and {@literal "random.long"} properties supports a range* suffix whose syntax is:* <p>* {@code OPEN value (,max) CLOSE} where the {@code OPEN,CLOSE} are any character and* {@code value,max} are integers. If {@code max} is provided then {@code value} is the* minimum value and {@code max} is the maximum (exclusive).** @author Dave Syer* @author Matt Benson* @since 1.0.0*/publicclassRandomValuePropertySourceextendsPropertySource<Random> {
/*** Name of the random {@link PropertySource}.*/publicstaticfinalStringRANDOM_PROPERTY_SOURCE_NAME="random";
privatestaticfinalStringPREFIX="random.";
privatestaticfinalLoglogger=LogFactory.getLog(RandomValuePropertySource.class);
publicRandomValuePropertySource() {
this(RANDOM_PROPERTY_SOURCE_NAME);
  }
publicRandomValuePropertySource(Stringname) {
super(name, newRandom());
  }
@OverridepublicObjectgetProperty(Stringname) {
if (!name.startsWith(PREFIX)) {
returnnull;
    }
logger.trace(LogMessage.format("Generating random property for '%s'", name));
returngetRandomValue(name.substring(PREFIX.length()));
  }
privateObjectgetRandomValue(Stringtype) {
if (type.equals("int")) {
returngetSource().nextInt();
    }
if (type.equals("long")) {
returngetSource().nextLong();
    }
Stringrange=getRange(type, "int");
if (range!=null) {
returngetNextIntInRange(range);
    }
range=getRange(type, "long");
if (range!=null) {
returngetNextLongInRange(range);
    }
if (type.equals("uuid")) {
returnUUID.randomUUID().toString();
    }
returngetRandomBytes();
  }
privateStringgetRange(Stringtype, Stringprefix) {
if (type.startsWith(prefix)) {
intstartIndex=prefix.length() +1;
if (type.length() >startIndex) {
returntype.substring(startIndex, type.length() -1);
      }
    }
returnnull;
  }
privateintgetNextIntInRange(Stringrange) {
String[] tokens=StringUtils.commaDelimitedListToStringArray(range);
intstart=Integer.parseInt(tokens[0]);
if (tokens.length==1) {
returngetSource().nextInt(start);
    }
returnstart+getSource().nextInt(Integer.parseInt(tokens[1]) -start);
  }
privatelonggetNextLongInRange(Stringrange) {
String[] tokens=StringUtils.commaDelimitedListToStringArray(range);
if (tokens.length==1) {
returnMath.abs(getSource().nextLong() %Long.parseLong(tokens[0]));
    }
longlowerBound=Long.parseLong(tokens[0]);
longupperBound=Long.parseLong(tokens[1]) -lowerBound;
returnlowerBound+Math.abs(getSource().nextLong() %upperBound);
  }
privateObjectgetRandomBytes() {
byte[] bytes=newbyte[32];
getSource().nextBytes(bytes);
returnDigestUtils.md5DigestAsHex(bytes);
  }
publicstaticvoidaddToEnvironment(ConfigurableEnvironmentenvironment) {
addToEnvironment(environment, logger);
  }
staticvoidaddToEnvironment(ConfigurableEnvironmentenvironment, Loglogger) {
MutablePropertySourcessources=environment.getPropertySources();
PropertySource<?>existing=sources.get(RANDOM_PROPERTY_SOURCE_NAME);
if (existing!=null) {
logger.trace("RandomValuePropertySource already present");
return;
    }
RandomValuePropertySourcerandomSource=newRandomValuePropertySource(RANDOM_PROPERTY_SOURCE_NAME);
if (sources.get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME) !=null) {
sources.addAfter(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, randomSource);
    }
else {
sources.addLast(randomSource);
    }
logger.trace("RandomValuePropertySource add to Environment");
  }
}

2.获取RandomValuePropertySource类的对象

       在使用时,只要new 一个RandomValuePropertySource对象就可以使用以上源码中的各种方法了。两种构造的具体的差别,查了下也没查到,都能用。。。

// new 一个随机属性源newRandomValuePropertySource("myRandom");
// new 默认的随机属性源叫 random 等价于 new RandomValuePropertySource("random");newRandomValuePropertySource();

3.写法

packagecom.xing.studyboot.util;
importorg.springframework.boot.env.RandomValuePropertySource;
/***  随机数工具类*  使用的时候 直接new获取* @author xing* @createTime 2021年5月11日 */publicclassRandomValueUtil {
publicstaticvoidmain(String[] args) {
// 自定义的一个随机值属性源,起名叫做 myRandomRandomValuePropertySourcerandom=newRandomValuePropertySource("myRandom");
// 随机生成一个整数System.out.println("random int:->"+random.getProperty("random.int"));
// 随机生成一个整数,指定上边界,不大于等于5System.out.println("random int(5):->"+random.getProperty("random.int(5)"));
// 使用()包围,2个字符 前闭后开=>比如 random.int(0,1)只能是0// 只要时两个符号就可以,不一定非要用()System.out.println("random int(0,1):->"+random.getProperty("random.int(0,1)"));
System.out.println("random int(0,10):->"+random.getProperty("random.int(0,10)"));
// ! 也行System.out.println("random int[0,1]:->"+random.getProperty("random.int!0,2!"));
// !0,5& 也行System.out.println("random int[0,1]:->"+random.getProperty("random.int!0,5&"));
// 前后各一个空格 也行 System.out.println("random int(1,3):->"+random.getProperty("random.int 1,3 "));
// 使用汉字包围,2个字符,前后各一个汉字 也行System.out.println("random int(3,4):->"+random.getProperty("random.int底3,4顶"));
// 使用英文字母包围,2个字符,前后各一个英文字母 也行System.out.println("random int(5,6):->"+random.getProperty("random.intL5,6U"));
// 使用数字包围,2个字符,前一个数字5,后一个数字6 也行System.out.println("random int(5,6):->"+random.getProperty("random.int55,66"));
// 随机生成一个长整数 System.out.println("random long:->"+random.getProperty("random.long"));
// 随机生成一个整数,使用区间[100,101),前闭后开=>只能是100System.out.println("random long(100,101):->"+random.getProperty("random.long(100,101)"));
// 随机生成一个 uuidSystem.out.println("random uuid:->"+random.getProperty("random.uuid"));
  }
}

好吧 费劲,直接看源码就能知道不管是啥字符,只要length对,就能获取,费了半天研究这个,没意思。。。


总结:

       RandomValuePropertySource类通过实例化对象可以根据传入的type来返回对应的随机数。在配置中直接通过typename->比如${random.int(10)}可以直接自动赋值随机数给配置的key。


就这。。。

目录
相关文章
|
5天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
17 2
|
13天前
|
安全 Java
java BigDecimal 的赋值一个常量
在 Java 中,`BigDecimal` 是一个用于精确计算的类,特别适合处理需要高精度和小数点运算的场景。如果你需要给 `BigDecimal` 赋值一个常量,可以使用其静态方法 `valueOf` 或者直接通过字符串构造函数。 以下是几种常见的方法来给 `BigDecimal` 赋值一个常量: ### 使用 `BigDecimal.valueOf` 这是推荐的方式,因为它可以避免潜在的精度问题。 ```java import java.math.BigDecimal; public class BigDecimalExample { public static void
|
16天前
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
|
19天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
105 1
|
27天前
|
消息中间件 分布式计算 Java
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
27 2
|
29天前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
62 4
|
29天前
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
89 4
|
28天前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
58 2
|
30天前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
42 1
|
11天前
|
存储 Java 编译器
[Java]基本数据类型与引用类型赋值的底层分析
本文详细分析了Java中不同类型引用的存储方式,包括int、Integer、int[]、Integer[]等,并探讨了byte与其他类型间的转换及String的相关特性。文章通过多个示例解释了引用和对象的存储位置,以及字符串常量池的使用。此外,还对比了String和StringBuilder的性能差异,帮助读者深入理解Java内存管理机制。
14 0

热门文章

最新文章