本文最后更新于:2023年8月24日 晚上
需求
注入application.yml配置文件中的常量
application.yml如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| aboutMe: name: FSAN age: 21 height: 172
about-you: name: FSAN age: 22 height: 174 map: k1: v1 k2: v2 list: - FSAN - BSAN me: name: BSAN age: 21 height: 173
|
使用@Value
entity > Me.java
1 2 3 4 5 6 7 8 9 10 11 12
| @Data @AllArgsConstructor @NoArgsConstructor @Component public class Me { @Value("${aboutMe.name}") private String name; @Value("#{${aboutMe.age} - 1}") private Integer age; @Value("${aboutMe.height}") private String height; }
|
${} 匹配式
#{} 运算式
测试类中调用测试
1 2 3 4 5 6 7 8 9 10 11
| @SpringBootTest class ValueConfigurationApplicationTests {
@Autowired private Me me;
@Test void contextLoads() { System.out.println(me); } }
|
使用注入属性之后,也只能通过注入才能显示注入好的值,使用 new Me() 去构造会显示为null
使用@ConfigurationProperties
entity > You.java
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Data @AllArgsConstructor @NoArgsConstructor @Component @ConfigurationProperties("about-you") public class You { private String name; private Integer age; private Integer height; private Map<String, Object> map; private List<String> list; private Me me; }
|
ConfigurationProperties使用这个注解的时候,注入的名字不能使用下划线和大写
测试类中调用测试
1 2 3 4 5 6 7 8 9 10 11
| @SpringBootTest class ValueConfigurationApplicationTests { @Autowired private You you;
@Test void contextLoads() { System.out.println(you); } }
|
区别
- @Value 只能注入一个属性,@ConfigurationProperties 能匹配多个
- @Value 不支持JSR303数据校验,@ConfigurationProperties 配合@Validated 能对数据做校验
- @Value 不能对复杂对象的直接封装(对象等)