springboot-配置文件的注入
- 2020 年 1 月 1 日
- 筆記
本文标识 : Jsbt0007
本文编辑 : Jack 风
编程工具 : IDEA
阅读时长 : 5分钟
title: springboot-08配置文件的注入
::: tip 配置文件值的注入
单值注入和批量注入
:::
1、单值注入
使用@Value注解注入单个属性的值
- yml配置文件
person: name: "zhangsan n lisi" age: 23 boss: true birth: 2019/11/21
- java代码
//datasource.properties 数据源的配置文件 //<bean ..> <property name="url" value="${url}"></property> </bean> @Value("${person.name}") private String name;
${key} :来引用属性文件中key对应的值
2、批量注入
使用@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:
- 将配置文件中配置的每一个属性的值,映射到这个组件中
- @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
- prefix = "person":配置文件中哪个下面的所有属性进行一一映射
- 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
- @Data是一个插件,,免去了getter/setter和toString这些繁琐的东西
如果在编写yml文件的时候没有出现属性提示:
我们可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
3、两种注入的区别
@Value获取值和@ConfigurationProperties获取值的区别
|
@ConfigurationProperties |
@Value |
---|---|---|
功能 |
批量注入配置文件中的属性 |
一个个指定 |
松散绑定(松散语法) |
支持 |
不支持 |
SpEL:##{} |
不支持 |
支持 |
JSR303数据校验 |
支持 |
不支持 |
复杂类型封装 |
支持 |
不支持 |
松散语法绑定:last_name = last-name = lastName 他们取的值都是相同的
配置文件yml还是properties他们都能获取到值;
总结:
- 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
- 如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
4、注入值的数据校验
@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; }
经过刚才的测试得出,两个注解不能同时作用在一个属性上。