SpringBoot属性注入
一、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注解注入:
目录结构:(下面我只写用得到的代码哦!注意目录名字)

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}的家在陕西省西安市高新区
输出:

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); } }
输出结果:

三、使用@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 + '}'; } }
输出结果:

四、补充说明:
补充一、数据校验
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}的家在陕西省西安市高新区
代码:

输出结果:

详表:
| 注解 | 验证的数据类型 | 说明 |
|---|---|---|
| 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}}
补充三、配置测试与正式环境方式

默认配置文件:(可以选择激活使用那个配置文件)

添加开发环境:

添加测试环境:

运行结果:(在默认配置中设置“test”为主,所以端口为8081反之则为8082)

补充四、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
争取摘到月亮,即使会坠落。

浙公网安备 33010602011771号