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。


就这。。。

目录
相关文章
|
6月前
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
610 4
|
7月前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
211 1
|
7月前
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
241 56
|
6月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
10月前
|
Java Shell 数据库
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
15893 12
|
Java
CentOS7.8配置Adoptium-Java17运行环境
本指南介绍如何设置清华镜像源并安装 Temurin-17-JRE 运行环境。首先,编辑 `/etc/yum.repos.d/adoptium.repo` 文件,配置清华镜像源。接着,使用 `yum install -y temurin-17-jre` 命令安装 Temurin-17-JRE,并通过 `java --version` 验证安装成功。相关配置和操作界面截图附后。
468 8
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
6845 4
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
1105 0