SpringBoot基础学习(三) 自定义配置、随机数设置及参数间引用
自定义配置
SpringBoot免除了项目中大部分手动配置,可以说,几乎所有的配置都可以写在全局配置文件application.peroperties中,SpringBoot会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义了配置文件,那么SpringBoot是无法识别这些配置文件的,此时需要我们手动加载。
接下来,将针对SpringBoot的自定义配置文件及其加载方式进行讲解。
(1)使用@PropertySource加载配置文件
我们可以使用@PropertySource注解结合@Configuration注解配置类的方式来加载自定义配置文件,@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保证SpringBoot能够扫描该注解,还需要在类上添加@Configuration注解将实体类作为自定义配置类。
如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties注解或者@Value注解进行属性值注入。
操作步骤:
1、在SpringBoot项目的resources目录下新建一个名为test.properties的自定义配置文件,在该配置文件中编写需要设置的配置属性:
- # 对实体类对象MyProperties进行属性配置
- test.id=1
- test.name=test
2、在com.hardy.springboot_demo.pojo包下新建一个配置类MyProperties,提供test.properties自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关的配置:
- package com.hardy.springboot_demo.pojo;
- /**
- * @Author: HardyYao
- * @Date: 2021/5/31
- */
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.boot.context.properties.EnableConfigurationProperties;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.PropertySource;
- @Configuration // 自定义配置类
- @PropertySource("classpath:test.properties") // 指定自定义配置文件的文件位置和文件名称
- @EnableConfigurationProperties(MyProperties.class) // 开启对应配置类的属性注入功能
- @ConfigurationProperties(prefix = "test") // 指定配置文件注入属性前缀
- public class MyProperties {
- private int id;
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "MyProperties{" +
- "id=" + id +
- ", name='" + name + '\'' +
- '}';
- }
- }
这里主要是新建一个自定义配置类,通过相关注解引入了自定义的配置文件,并完成了自定义属性值的注入。
针对上述的几个注解,进行逐一讲解:
- @Configuration注解表示当前类是一个自定义配置类,并添加为Spring容器的组件,这里也可以使用传统的@Component注解实现相同的功能;
- @PropertySource("classpath:test.properties")注解指定了定义配置文件的文件位置和文件名称,此处表示自定义配置文件为classpath类路径下的test.properties文件;
- @ConfigurationProperties(prefix = "test")将上述自定义配置文件test.properties中以test开头的属性值注入到该配置类属性中;
- 如果配置类上使用的是@Component注解而非@Configuration注解,那么@EnableConfigurationProperties注解还可以省略。
3、编写测试方法进行测试:
- @Autowired
- private MyProperties myProperties;
- @Test
- void myPropertiesTest() {
- System.out.println(myProperties);
- }
测试结果:
(2)使用@Configuration编写自定义配置类
在SpringBoot框架中,推荐使用配置类的方式向容器中添加和配置组件。
在SpringBoot框架中,通常使用@Configuration注解定义一个配置类,SpringBoot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。
当自定义一个配置类后,还需要在类中的方法上加上@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的name或value属性自定义组件的名称。
操作步骤:
1、在com.hardy.springboot_demo包下新建一个config包,并在该包下新建一个MyService类,该类中不需要写任何代码:
- package com.hardy.springboot_demo.config;
- /**
- * @Author: HardyYao
- * @Date: 2021/5/31
- */
- public class MyService {
- }
由于该类目前没有任何配置和注解,因此还无法正常被SpringBoot扫描和识别。
2、在config包下,新建一个MyConfig类,并使用@Configuration注解将该类声明为一个配置类,该类的内容如下:
- package com.hardy.springboot_demo.config;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- /**
- * @Author: HardyYao
- * @Date: 2021/5/31
- */
- @Configuration // 定义该类为一个配置类
- public class MyConfig {
- /**
- * 将返回值对象作为组件添加到Spring容器中,该组件id默认为方法名
- * @return
- */
- @Bean
- public MyService myService(){
- return new MyService();
- }
- }
MyConfig是@Configuration注解声明的配置类(类似于声明了一个XML配置文件),该配置类会被SpringBoot自动扫描识别。
使用@Bean注解的myService()方法,其返回值对象会作为组件添加到Spring容器中(类似于XML配置文件中的标签配置),并且该组件id默认为方法名myService。
3、编写测试方法进行测试
- @Autowired
- private ApplicationContext applicationContext;
- @Test
- void iocTest() {
- System.out.println(applicationContext.containsBean("myService"));
- }
上述代码中,先通过@Autowired注解注入Spring容器示例ApplicationContext,然后在测试方法iocTest()中测试查看该容器中是否包含id为myService的组件。
执行测试方法iocTest(),运行结果如下:
从测试结果可以看出,测试方法iocTest()运行成功,显示运行结果为true,表示Spirng的IOC容器中也包含了id为myService的实例对象组件,说明使用自定义配置类的形式完成了向Spring容器进行组件的添加和配置。
随机数设置及参数间引用
在SpringBoot配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值和参数间引用对属性值进行设置。下面,针对配置文件中这两种属性值的设置方式进行讲解。
随机值设置
在SpringBoot配置文件中,随机值设置使用到了SpringBoot内嵌的RandomValuePropertySource类,对一些隐秘属性值或者测试用例属性值进行随机值注入。
随机值设置的语法格式为${random.xx},xx表示需要制定生成的随机数类型和范围,它可以生成随机的整数、uuid或字符串,示例代码如下:
- 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提供的随机数类型,分别展示了不同类型随机值的设置示例。
参数间引用
在SpringBoot配置文件中,配置文件的属性值还可以进行参数间的引用,也就是在后一个配置的属性值中直接引用先前定义过的属性,这样就可以直接解析其中的属性值了。
使用参数间引用的好处就是,在多个具有相互关联的配置属性中,只需要对其中一处属性进行预先配置,那么其他地方都可以引用,省去了后续多处修改的麻烦。
参数间引用的语法格式为${xx},xx表示先前在配置文件中已经配置过的属性名,示例代码如下:
- app.name=MyApp
- app.description=${app.name} is a Spring Boot application
上述参数间引用设置示例中,先设置了“app.name=MyApp”,将app.name属性的属性值设置为了MyApp;接着,在app.description属性配置中,使用${app.name}对前一个属性进行了引用。
接下来,通过一个案例来演示使用随机值设置以及参数间引用的方式进行属性设置的具体使用和效果,具体步骤如下:
1、打开全局配置文件application.properties,在该配置文件中分别通过随机值设置和参数间引用来配置两个属性,示例代码如下:
- # 随机值设置以及参数间引用配置
hardy.age=${random.int[20,30]}
hardy.description=hardy的年龄可能是${hardy.age}
在上述application.properties配置文件中,先使用随机数设置了hardy.age的属性值,该属性值的取值范围在[10,20]之间,随后使用参数间引用配置了hardy.description属性。
2、在项目的测试类中添加description属性,并将配置文件中hardy.description的属性进行注入,然后新增一个测试方法进行测试,测试代码如下:
- @Value("${hardy.description}")
- private String description;
- @Test
- void placeholderTest() {
- System.out.println(description);
- }
在上述代码中,通过@Value("${hardy.description}")注解将配置文件中的hardy.description属性值注入到了对应的description属性中,在测试方法placeholderTest()中对该属性值进行了输出打印。
执行测试方法后,控制台输出结果如下所示:
可以看到,测试方法placeholderTest()成功打印出了description属性的注入内容(age的取值始终在[20,30]之间随机显示),该内容与配置文件中配置的属性值保持一致。
SpringBoot基础学习(三) 自定义配置、随机数设置及参数间引用的更多相关文章
- SpringBoot基础系列之自定义配置源使用姿势实例演示
[SpringBoot基础系列]自定义配置源的使用姿势介绍 前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如 ...
- MacOS下SpringBoot基础学习
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springboot"获取视频和教程资料! b站在线视 ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- springboot~yml里的自定义配置~续
之前写了关于读取自定义配置的文章springboot~yml里的自定义配置,而今天主要说一下对复杂配置信息的读取方法,我们简单的配置用@Value注解就可以了,而结构复杂的一般使用@Configura ...
- 零基础学习前端1-1配置node及npm环境变量
零基础学习前端1-1配置node及npm环境变量 ## 1-1配置node及npm环境变量 首先:下载node 可以直接去官方网站下载 1.首先从官网下载安装包 https://nodejs.org/ ...
- Python基础学习三
Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...
- SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入
全局配置文件 全局配置文件能够对一些默认配置值进行修改.SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件, ...
- AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)
在salesforce的classic中,我们使用{!expresion}在前台页面展示信息,在lightning中,上一篇我们也提及了,如果展示attribute的值,可以使用{!v.expresi ...
随机推荐
- Day16_95_IO_循环读取文件字节流read()方法(四)
循环读取文件字节流read()方法(四) 使用 int read(byte[] bytes) 循环读取字节流数据 import java.io.FileInputStream; import java ...
- 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架
目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...
- Django 入门范例
1. Django 介绍 2. Django 环境搭建 3. 模型(Model) 4. 站点管理 5. 视图(View) 6. 模板(Template) 1. Django 介绍 MVC 模型 大部分 ...
- Mysql - 使用入门
本文是学习 Mysql必知必会 后的笔记 学习之前需要创建一个数据库,然后导入下面两个mysql脚本 create database db1 charset utf8; ############### ...
- 【.NET 与树莓派】数模转换
在开始之前,需要说明一对很耳熟的概念--数字信号 & 模拟信号. 这些概念的理论有些复杂,你如果相当有兴趣,可以找来有关的文献细细研究:若你不关心那是啥只想知道咋用,那就通俗但不庸俗地理解一下 ...
- netcore获取配置文件的内容
结合了好几个哥们的写法,最终我使用了这个版本,现在把我这个版本的写出来,如果该版本和您的版本类似或者一样,那可能是借鉴您的 using Microsoft.AspNetCore.Hosting; us ...
- hdu2870暴力或者dp优化
题意: 给你一个矩阵,俩面的字母有一些转换规则,让你找到最大的相同字母字矩阵.. 思路: 一共有三种情况,就是a,b,c三种,我们可以分开来处理这三种情况,比如先处理a的,吧能转 ...
- hdu4847 水题
题意: 你看了上面很长很长的一片英语课文之后,发现根本不用看,直接看输入输出就行了,就是给你一坨字符串,然后问你里面有几个doge(不区分大小写). 思路: 没啥说的,直接写吧 ...
- Jenkins反序列化漏洞复现
Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: 持 ...
- node-全局对象
Node.js 全局对象 JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量. 全局对象与全局变量 global ...