哈喽,大家好,我是有勇氣的牛排(全網同名)🐮🐮🐮
有問題的小夥伴歡迎在文末評論,點贊、收藏是對我最大的支援!!!。
1 使用 @Value 注解
/*
* @Author : 有勇氣的牛排
* @FileName: ReadProperties.java
* desc :
* */
package com.couragesteak.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadProperties {
@Value("${cs.name}")
private String name;
@Value("${cs.star}")
private String star;
// http://127.0.0.1:8080/getProperties
@RequestMapping("/getProperties")
public String getProperties() {
return name + ":" + star;
}
}
2 使用 ConfigurationProperties
@ConfigurationProperties
加載配置通過 BeanPostProcessor實作,其對應的Bean的後置處理器為 ConfigurationPropertiesBindingPostProcessor,也就是在bean被執行個體化後,會調用後置處理器,遞歸的查找屬性,通過反射機制注入值,是以需要提供getter和setter方法。
此外,針對此種屬性注入的方式,SpringBoot支援
Relaxed Bingding
,即秩序保證配置檔案的屬性和setter方法名相同即可。
注意事項
(1) 屬性必須要有getter、setter方法
(2) 如果屬性類型是集合,需要確定集合是不可變的。
(3) 如果使用Lombok自動生成 getter/setter方法,一定不要生成對應的任何構造函數,因為Spring IOC容器會自動使用它來執行個體化對象。
(4) 使用JavaBean屬性綁定的方式隻針對
标準Java Bean屬性
,不支援對靜态屬性的綁定。
配置檔案
application.yml
cs:
name: cs
star: 9
2.1 Maven依賴
<!--導入配置檔案處理器,配置檔案進行綁定就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.2 實體類
/*
* @Author : 有勇氣的牛排
* @FileName: UserEntity.java
* desc :
* */
package com.couragesteak.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "cs")
public class UserEntity {
private String name;
private String star;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getstar() {
return star;
}
public void setstar(String star) {
this.star = star;
}
@Override
public String toString() {
return "UserEntity{" +
"name='" + name + '\'' +
", star='" + star + '\'' +
'}';
}
}
2.3 後端
/*
* @Author : 有勇氣的牛排
* @FileName: ReadProperties_ConfigurationProperties.java
* desc : ConfigurationProperties 配置檔案讀取
* */
package com.couragesteak.service;
import com.couragesteak.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadProperties_ConfigurationProperties {
@Autowired
private UserEntity userEntity;
//
@RequestMapping("/getInfo")
public String getInfo(String userName, Integer age){
System.out.println("666");
return userEntity.toString();
}
}
注意事項
Spring考慮到帶有注釋@ConfigurationProperties的類可能不适合掃描(比如:我正在開發自己的自動配置或希望有條件地啟用它們),是以Spring并不會自動掃描帶有注釋@ConfigurationProperties的類。
在這些情況下,推薦使用@EnableConfigurationProperties注解指定要處理的類型清單(即:将@ConfigurationProperties注釋的類加到Spring IOC容器中)。一般通過将@EnableConfigurationProperties加在@Configuration類上完成。
3 @Value和@ConfigurationProperties的差別
(1) @ConfigurationProperties注解支援屬性檔案和javabean映射;而@Value支援spel表達式。
(2) @ConfigurationProperties注解支援全量的屬性,寬松綁定方式;而@Vavlue隻推薦使用标準的
kebab-case
方式(僅使用小寫字母和
-
),例如
@Value("{demo.item-price}")
可以提取
demo.item-price
和
demo-itemPrice
。
(3) 對于多個屬性映射,并且屬性嘗嘗被複用時,推薦使用@ConfigurationProperties;隻讀取單個屬性使用@Value更加友善。
參考位址:
- 餘勝軍
- https://developer.aliyun.com/article/1058227
- https://www.couragesteak.com/article/292