本文标识 : Jsbt0007
本文编辑 : Jack 风
编程工具 : IDEA
阅读时长 : 5分钟
title: springboot-08配置文件的注入
::: tip 配置文件值的注入
单值注入和批量注入
:::
使用@Value注解注入单个属性的值
person:
name: "zhangsan \n lisi"
age: 23
boss: true
birth: 2019/11/21
//datasource.properties 数据源的配置文件
//<bean ..> <property name="url" value="${url}"></property> </bean>
@Value("${person.name}")
private String name;
${key} :来引用属性文件中key对应的值
使用@ConfigurationProperties注解批量注入配置文件中的多个值
配置文件
person:
lastName: 年少风
age: 18
boss: false
birth: 2019/11/20
maps: {k1: v1, k2: 12}
lists:
- 张三
- 李四
dog:
name: 哈士奇
age: 2
@Data是一个lomlok插件,免去了getter/setter和toString这些繁琐的东西
在POM文件的节点中间添加
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
//封装配置文件中person中的数据
@ConfigurationProperties(prefix = "person")
@Component
@Data
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<String> lists;
private Dog dog;
}
使用@ConfigurationProperties注解必须同时添加@Component讲当前的配置类放入IOC容器中
@Data
public class Dog {
private String name;
private Integer age;
}
@RestController
public class HelloController {
Logger log = LoggerFactory.getLogger(HelloController.class);
@Autowired
private Person person;
@GetMapping("/hello")
public String hello(){
log.info(person.toString());
return "hello SpringBoot-swagger";
}
}
Person(lastName=年少风, age=18, boss=false, birth=Tue Nov 12 00:00:00 CST 2019, maps={k1=v1, k2=12}, lists=[张三, 李四], dog=Dog(name=哈士奇, age=2))
javaBean:
如果在编写yml文件的时候没有出现属性提示:
我们可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Value获取值和@ConfigurationProperties获取值的区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL:##{} | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
松散语法绑定:last_name = last-name = lastName 他们取的值都是相同的
配置文件yml还是properties他们都能获取到值;
总结:
@ConfigurationProperties(prefix = "person")
@Component
@Data
@Validated //数据校验
public class Person {
@Email(message = "用户名必须是一个正确的邮箱格式")
private String lastName;
@Max(value = 200,message = "年龄不能超过200岁")
@Min(value = 0,message = "年龄必须大于0岁")
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<String> lists;
private Dog dog;
}
经过刚才的测试得出,两个注解不能同时作用在一个属性上。