一、SpringBoot的属性注入解释:( @Value / @ConfigurationProperties )
1.1):使用SpringBoot全局配置文件设置属性时:
-
如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并 读取这些配置文件中的属性值并覆盖默认属性。
-
如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配 置属性方可生效。
1.2):属性注入常用注解包括:
-
@Configuration:声明一个类作为配置类。
-
@Bean:声明在方法上,将方法的返回值加入Bean容器。
-
@Value:属性注入。
-
@ConfigurationProperties(prefix = "users"):批量属性注入。
-
@PropertySource("classpath:/jdbc.properties")指定外部属性文件。在类上添加。
| @ConfigurationProperties | @Value |
功能 |
批量注入配置文件中的属性 |
一个个指定 |
松散绑定(松散语法) |
支持 |
不支持 |
SpEL |
不支持 |
支持 |
JSR303数据校验 |
支持 |
不支持 |
复杂类型封装 |
支持 |
不支持 |
二、使用@Value属性注入:
Demo案例代码,并利用@Value注解注入:
目录结构:(下面我只写用得到的代码哦!注意目录名字)
![](https://img2022.cnblogs.com/blog/1835940/202208/1835940-20220805165850521-1011027692.png)
Users.java:
package com.sxtt.controller.Beans;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/***
* @Author Laugh"
*
* 可以通过@Value + SPEL 直接绑定SpringBoot配置文件 .yml里的值
* @Value() 固定写法,“${XXXX.XXXX}” 配置文件里面的值
* 案例1:
* @Value("${users.username}")
* private String username;
*
* 案例2:
* @ConfigurationProperties(prefix="users")
* 常用于bean属性和.yml配置文件
* prefix属性 可以指定配置文件中的某节点,该节点中的子节点将自动和属性进行配对绑定
* 注意:ConfigurationProperties 这个注解 比较简单,应该说是比较容易/松散,不限定特殊写法,例如:大写 / 驼峰 / 下划线 / 中划线 / 小写 都会被识别
*/
@Component
public class Users {
@Value("${users.username}")
private String username;
@Value("${users.age}")
private Integer age;
private List<String> hobby;
private Date birthday;
private Map<Integer,String> girlfriend;
private Address address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<Integer, String> getGirlfriend() {
return girlfriend;
}
public void setGirlfriend(Map<Integer, String> girlfriend) {
this.girlfriend = girlfriend;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Users{" +
"username='" + username + '\'' +
", age=" + age +
", hobby=" + hobby +
", birthday=" + birthday +
", girlfriend=" + girlfriend +
", address=" + address +
'}';
}
}
application.yml:
server:
port: 8080
servlet:
context-path: /laugh
users:
user_Name: Laugh"
age: 25
birthday: 2022/02/25
# 行内写法
#hobby: [吃,喝,玩,乐]
# 一般写法
hobby:
- 吃
- 喝
- 玩
# 行内写法
#girlfriend: {15: 小天, 18: 小锤, 20: 小鸟, 21: 小璐 }
# 一般写法
girlfriend:
15: 小天
18: 小锤
20: 小鸟
21: 小露
# 需要注意: address 为对象,所以下面的 id / desc 必须为对象的属性
address:
id: 1
desc: 陕西省西安市高新区
补充:yml,引用属性占位符。
address:
id: 1
desc: ${users.user_Name}的家在陕西省西安市高新区
输出:
![](https://img2022.cnblogs.com/blog/1835940/202209/1835940-20220925173426790-2132306596.png)
App.java:
package com.sxtt;
import com.sxtt.controller.Beans.Users;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class App {
@Autowired
private Users user;
@Test
void contextLoads(){
System.out.println(user);
}
}
输出结果:
![](https://img2022.cnblogs.com/blog/1835940/202209/1835940-20220925172659299-2008490679.png)
三、使用@ConfigurationProperties属性注入:
Demo案例代码,并利用@ConfigurationProperties注解注入:
目录结构同上:
注意:其余不变,改变的只有Users.java哦:
Users.java:
package com.sxtt.controller.Beans;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/***
* @Author Laugh"
*
* 可以通过@Value + SPEL 直接绑定SpringBoot配置文件 .yml里的值
* @Value() 固定写法,“${XXXX.XXXX}” 配置文件里面的值
* 案例1:
* @Value("${users.username}")
* private String username;
*
* 案例2:
* @ConfigurationProperties(prefix="users")
* 常用于bean属性和.yml配置文件
* prefix属性 可以指定配置文件中的某节点,该节点中的子节点将自动和属性进行配对绑定
* 注意:ConfigurationProperties 这个注解 比较简单,应该说是比较容易/松散,不限定特殊写法,例如:大写 / 驼峰 / 下划线 / 中划线 / 小写 都会被识别
*/
@Component
@ConfigurationProperties(prefix="users")
public class Users {
private String username;
private Integer age;
private List<String> hobby;
private Date birthday;
private Map<Integer,String> girlfriend;
private Address address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<Integer, String> getGirlfriend() {
return girlfriend;
}
public void setGirlfriend(Map<Integer, String> girlfriend) {
this.girlfriend = girlfriend;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Users{" +
"username='" + username + '\'' +
", age=" + age +
", hobby=" + hobby +
", birthday=" + birthday +
", girlfriend=" + girlfriend +
", address=" + address +
'}';
}
}
输出结果:
![](https://img2022.cnblogs.com/blog/1835940/202208/1835940-20220805171638917-2104374744.png)
四、补充说明:
补充一、数据校验
server:
port: 8080
servlet:
context-path: /laugh
users:
user_Name: Laugh"
age: 25
birthday: 2022/02/25
# 行内写法
#hobby: [吃,喝,玩,乐]
# 一般写法
hobby:
- 吃
- 喝
- 玩
# 行内写法
#girlfriend: {15: 小天, 18: 小锤, 20: 小鸟, 21: 小璐 }
# 一般写法
girlfriend:
15: 小天
18: 小锤
20: 小鸟
21: 小露
# 需要注意: address 为对象,所以下面的 id / desc 必须为对象的属性
# address:
# id: 1
# desc: ${users.user_Name}的家在陕西省西安市高新区
代码:
![](https://img2022.cnblogs.com/blog/1835940/202209/1835940-20220925184231935-2084128762.png)
输出结果:
![](https://img2022.cnblogs.com/blog/1835940/202209/1835940-20220925184334429-2116758424.png)
详表:
注解 | 验证的数据类型 | 说明 |
Null |
所有类型 |
验证元素值必须为 null |
NotNull |
所有类型 |
验证元素值必须不为 null |
NotBlank |
CharSequence |
验证元素值不能为 null,并且至少包含一个非空白字符。 |
NotEmpty |
CharSequence、Collection、Map、Array |
验证元素值不能为 null,且不能为空 |
Size(min = min, max = max) |
同 NotEmpty |
验证元素的 size 必须在 min 和 max 之间(包含边界),认为 null 是有效的 |
AssertFalse |
boolean、Boolean |
验证元素值必须为 false,认为 null 是有效的 |
AssertTrue |
同 AssertFalse |
验证元素值必须为 true,认为 null 是有效的 |
DecimalMax(value=, inclusive=) |
BigDecimal、BigInteger、CharSequence,byte、 short、int、long 及其包装类型,由于舍入错误,不支持double和float |
验证元素值必须小于等于指定的 value 值,认为 null 是有效的 |
DecimalMin |
同 DecimalMax |
验证元素值必须大于等于指定的 value 值,认为 null 是有效的 |
Max |
同 DecimalMax,不支持CharSequence |
验证元素值必须小于等于指定的 value 值,认为 null 是有效的 |
Min |
同 DecimalMax,不支持CharSequence |
验证元素值必须大于等于指定的 value 值,认为 null 是有效的 |
Digits(integer =, fraction =) |
同 DecimalMax |
验证元素整数位数的上限 integer 与小数位数的上限 fraction,认为 null 是有效的 |
Positive |
BigDecimal、BigInteger,byte、short、int、long、float、double 及其包装类型 |
验证元素必须为正数,认为 null 是有效的 |
PositiveOrZero |
同Positive |
验证元素必须为正数或 0,认为 null 是有效的 |
Negative |
同Positive |
验证元素必须为负数,认为 null 是有效的 |
NegativeOrZero |
同Positive |
验证元素必须为负数或 0,认为 null 是有效的 |
Future |
Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime、HijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate |
验证元素值必须是一个将来的时间,认为 null 是有效的 |
FutureOrPresent |
同 Future |
验证元素值必须是当前时间或一个将来的时间,认为 null 是有效的 |
Past |
同 Future |
验证元素值必须是一个过去的时间,认为 null 是有效的 |
PastOrPresent |
同 Future |
验证元素值必须是当前时间或一个过去的时间,认为 null 是有效的 |
Email(regexp = 正则表达式,flag = 标志的模式) |
CharSequence |
验证注解的元素值是Email,可以通过 regexp 和 flag 指定自定义的 email 格式,认为 null 是有效的 |
Pattern |
同 Email |
验证元素值符合正则表达式,认为 null 是有效的 |
补充二、随机数/随机字符串
4.1):随机数补充,及其用法:
名称 | 描述 |
$(random.value) |
取随机字符串 |
$(random.int) |
取随机 int 型数据 |
$(random.long) |
取随机 long 型数据 |
$(random.interesting(10)) |
取10以内随机数 |
$(random.int[10,20] |
取10-20之间的随机数 |
users:
user_Name: ${random.value}}
age: ${random.int}}
补充三、配置测试与正式环境方式
![](https://img2023.cnblogs.com/blog/1835940/202311/1835940-20231123162156278-446519795.png)
默认配置文件:(可以选择激活使用那个配置文件)
![](https://img2023.cnblogs.com/blog/1835940/202311/1835940-20231123162315249-564342566.png)
添加开发环境:
![](https://img2023.cnblogs.com/blog/1835940/202311/1835940-20231123162457577-1036041864.png)
添加测试环境:
![](https://img2023.cnblogs.com/blog/1835940/202311/1835940-20231123162519676-426611794.png)
运行结果:(在默认配置中设置“test”为主,所以端口为8081反之则为8082)
![](https://img2023.cnblogs.com/blog/1835940/202311/1835940-20231123162622209-1700596368.png)
补充四、yml写法
其.yml配置文件,可以有很多种写法:
4.2):小写:
users:
username: Laugh"
age: 25
4.3):大写:
users:
USERNAME: Laugh"
AGE: 25
4.4):驼峰:
users:
userName: Laugh"
age: 25
4.5):中划线:
users:
user-Name: Laugh"
age: 25
4.6):下划线:
users:
user_Name: Laugh"
age: 25