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; }
經過剛才的測試得出,兩個註解不能同時作用在一個屬性上。