1.8 随机数设置及参数间引用
在 Spring Boot 配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值和参数间引用对属性值进行设置。下面,针对配置文件中这两种属性值的设置方式进行讲解
1.8.1 随机值设置
在 Spring Boot 配置文件中,随机值设置使用到了 Spring Boot 内嵌的 RandomValuePropertySource 类,对一些隐秘属性值或者测试用例属性值进行随机值注入
随机值设置的语法格式为 ${random.xx},xx 表示需要指定生成的随机数类型和范围,它可以生成随机的整数、uuid 或字符串,示例代码如下
properties
my.secret=${random.value} // 配置随机值
my.number=${random.int} // 配置随机整数
my.bignumber=${random.long} // 配置随机 long 类型数
my.uuid=${random.uuid} // 配置随机 uuid 类型数
my.number.less.than.ten=${random.int(10)} // 配置小于 10 的随机整数
my.number.in.range=${random.int[1024,65536]} // 配置范围在 [1024,65536] 之间的随机整数
上述代码中,使用 RandomValuePropertySource 类中 random 提供的随机数类型,分别展示了不同类型随机值的设置示例
1.8.2 参数间引用
在 Spring Boot 配置文件中,配置文件的属性值还可以进行参数间的引用,也就是在后一个配置的属性值中直接引用先前已经定义过的属性,这样可以直接解析其中的属性值了。
使用参数间引用的好处就是,在多个具有相互关联的配置属性中,只需要对其中一处属性预先配置,其他地方都可以引用,省去了后续多处修改的麻烦
参数间引用的语法格式为 ${xx},xx 表示先前在配置文件中已经配置过的属性名,示例代码如下
properties
app.name=MyApp
app.description=${app.name} is a Spring Boot application
上述参数间引用设置示例中,先设置了“app.name=MyApp”,将 app.name 属性的属性值设置为了 MyApp;接着,在 app.description 属性配置中,使用 ${app.name}对前一个属性值进行了引用
接下来,通过一个案例来演示使用随机值设置以及参数间引用的方式进行属性设置的具体使用和效果,具体步骤如下
(1)打开 Spring Boot 项目 resources 目录下的 application.properties 配置文件,在该配置文件中分别通过随机值设置和参数间引用来配置两个测试属性,示例代码如:
properties
随机值设置以及参数间引用配置
tom.age=${random.int[10,20]}
tom.description=tom 的年龄可能是 ${tom.age}
在上述 application.properties 配置文件中,先使用随机值设置了 tom.age 属性的属性值,该属性值设置在了 [10,20] 之间,随后使用参数间引用配置了 tom.description 属性
(2)打开 \ 项目的测试类,在该测试类中新增字符串类型的 description 属性,并将配置文件中的 tom.description 属性进行注入,然后新增一个测试方法进行输出测试,示例代码如下
java
@Value(“${tom.description}”)
private String description;
@Test
public void placeholderTest() {
System.out.println(description);
}
上述代码中,通过 @Value(“${tom.description}”)注解将配置文件中的 tom.description 属性值注入到了对应的 description 属性中,在测试方法 placeholderTest()中对该属性值进行了输出打印。
执行测试方法 placeholderTest(),查看控制台输出效果
<img src=”./images/image-20191225172004276.png” alt=”image-20191225172004276″ style=”zoom:80%;” />
可以看出,测试方法 placeholderTest()运行成功,并打印出了属性 description 的注入内容,该内容与配置文件中配置的属性值保持一致。接着,重复执行测试方法 placeholderTest(),查看控制台输出语句中显示的年龄就会在 [10,20] 之间随机显示
- SpringBoot 原理深入及源码剖析
传统的 Spring 框架实现一个 Web 服务,需要导入各种依赖 JAR 包,然后编写对应的 XML 配置文件等,相较而言,Spring Boot 显得更加方便、快捷和高效。那么,Spring Boot 究竟如何做到这些的呢?
接下来分别针对 Spring Boot 框架的依赖管理、自动配置和执行流程进行深入分析
2.1 依赖管理
问题:(1)为什么导入 dependency 时不需要指定版本?
在 Spring Boot 入门程序中,项目 pom.xml 文件有两个核心依赖,分别是 spring-boot-starter-parent 和 spring-boot-starter-web,关于这两个依赖的相关介绍具体如下:
1.spring-boot-starter-parent 依赖 **
在 chapter01 项目中的 pom.xml 文件中找到 spring-boot-starter-parent 依赖,示例代码如下:
xml
<!– Spring Boot 父项目依赖管理 –>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent<11./artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!– lookup parent from repository –>
</parent>
上述代码中,将 spring-boot-starter-parent 依赖作为 Spring Boot 项目的统一父项目依赖管理,并将项目版本号统一为 2.2.2.RELEASE,该版本号根据实际开发需求是可以修改的
使用“Ctrl+ 鼠标左键”进入并查看 spring-boot-starter-parent 底层源文件,发现 spring-boot-starter-parent 的底层有一个父依赖 spring-boot-dependencies,核心代码具体如下
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
继续查看 spring-boot-dependencies 底层源文件,核心代码具体如下:
xml
<properties>
<activemq.version>5.15.11</activemq.version>
…
<solr.version>8.2.0</solr.version>
<mysql.version>8.0.18</mysql.version>
<kafka.version>2.3.1</kafka.version>
<spring-amqp.version>2.2.2.RELEASE</spring-amqp.version>
<spring-restdocs.version>2.0.4.RELEASE</spring-restdocs.version>
<spring-retry.version>1.2.4.RELEASE</spring-retry.version>
<spring-security.version>5.2.1.RELEASE</spring-security.version>
<spring-session-bom.version>Corn-RELEASE</spring-session-bom.version>
<spring-ws.version>3.0.8.RELEASE</spring-ws.version>
<sqlite-jdbc.version>3.28.0</sqlite-jdbc.version>
<sun-mail.version>${jakarta-mail.version}</sun-mail.version>
<tomcat.version>9.0.29</tomcat.version>
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
<thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version>
…
</properties>
从 spring-boot-dependencies 底层源文件可以看出,该文件通过 <properties> 标签对一些常用技术框架的依赖文件进行了统一版本号管理,例如 activemq、spring、tomcat 等,都有与 Spring Boot 2.2.2 版本相匹配的版本,这也是 pom.xml 引入依赖文件不需要标注依赖文件版本号的原因。
需要说明的是,如果 pom.xml 引入的依赖文件不是 spring-boot-starter-parent 管理的,那么在 pom.xml 引入依赖文件时,需要使用 <version> 标签指定依赖文件的版本号。
刚学了拉勾教育的《Java 工程师高薪训练营》,看到刚学到的点就回答了。希望拉勾能给我推到想去的公司,目标:字节!!