從配置文件中獲取屬性應該是SpringBoot開發中最為常用的功能之一,但就是這麼常用的功能,仍然有很多開發者抓狂~今天帶大家簡單回顧一下這六種的使用方式: ...
從配置文件中獲取屬性應該是SpringBoot開發中最為常用的功能之一,但就是這麼常用的功能,仍然有很多開發者抓狂~今天帶大家簡單回顧一下這六種的使用方式:
說明 | |
---|---|
Environment對象 | Environment 是 springboot 核心的環境配置介面,它提供了簡單的方法來訪問應用程式屬性,包括系統屬性、操作系統環境變數、命令行參數、和應用程式配置文件中定義的屬性等等,使用 Environment 方式來獲取配置屬性值非常簡單,只要註入Environment類調用其方法**getProperty(屬性key)**即可 |
@Value | @Value註解是Spring框架提供的用於註入配置屬性值的註解,它可用於類的成員變數、方法參數和構造函數參數上, 在應用程式啟動時,使用 @Value 註解的 Bean 會被實例化。所有使用了 @Value 註解的 Bean 會被加入到 PropertySourcesPlaceholderConfigurer 的後置處理器集合中。當後置處理器開始執行時,它會讀取 Bean 中所有 @Value 註解所標註的值,並通過反射將解析後的屬性值賦值給標有 @Value 註解的成員變數、方法參數和構造函數參數。重要!!! ⚠️註意 ①在使用 @Value 註解時需要確保註入的屬性值已經載入到 Spring 容器中,否則會導致註入失敗; ②建議引用變數的時候給定一個預設值,避免啟動報“缺失配置”的錯誤; ③通過依賴註入的方式獲取對象中屬性值,切記不要使用new的方式來創建對象獲取其屬性。 |
@ConfigurationProperties | SpringBoot 提供的一種更加便捷來處理配置文件中的屬性值的方式,可以通過自動綁定和類型轉換等機制,將指定首碼的屬性集合自動綁定到一個Bean對象上。 |
@PropertySources | @PropertySources 註解的實現原理相對簡單,應用程式啟動時掃描所有被該註解標註的類,獲取到註解中指定自定義配置文件的路徑,將指定路徑下的配置文件內容載入到 Environment 中,這樣可以通過 @Value 註解或 Environment.getProperty() 方法來獲取其中定義的屬性值了。預設只限讀取properties文件內容,想載入yaml文件內容,可以自定義factory適配器,指定factory具體的使用 |
YamlPropertiesFactoryBean對象 | 只限讀取yaml文件,通過 @Value 註解或 Environment.getProperty() 方法來配合著獲取其中定義的屬性值。 |
JAVA原生 | 通過java.util.Properties去載入配置文件中的屬性, |
一、Environment
註入Environment類調用其方法getProperty(屬性key)即可
@Slf4j
@SpringBootTest
public class EnvironmentTest {
@Resource
private Environment env;
@Test
public void var1Test() {
String var1 = env.getProperty("env.var1");
log.info("Environment獲取的配置內容:{}", var1);
}
}
二、@Value 註解
只要在變數上加註解 @Value("${env.var1}")就可以了,@Value 註解會自動將配置文件中的env.var1屬性值註入到var1欄位中。
@Slf4j
@SpringBootTest
public class EnvVariablesTest {
@Value("${env.var1}")
private String var1;
@Test
public void var1Test(){
log.info("配置文件屬性: {}",var1);
}
}
三、@ConfigurationProperties 註解
在 application.yml 配置文件中添加配置項:
env:
var1: 變數值1
var2: 變數值2
創建一個 MyConf 類用於承載所有首碼為env的配置屬性。
@Data
@Configuration
@ConfigurationProperties(prefix = "env")
public class MyConf {
private String var1;
private String var2;
}
在需要使用var1、var2屬性值的地方,將 MyConf 對象註入到依賴對象中即可。
@Slf4j
@SpringBootTest
public class ConfTest {
@Resource
private MyConf myConf;
@Test
public void myConfTest() {
log.info("@ConfigurationProperties註解獲取的配置內容:{}", JSON.toJSONString(myConf));
}
}
四、@PropertySources 註解
在 src/main/resources/ 目錄下創建自定義配置文件 important.properties,增加兩個屬性。
env.var1=變數值1
env.var2=變數值2
在需要使用自定義配置文件的類上添加 @PropertySources 註解,註解 value屬性中指定自定義配置文件的路徑,可以指定多個路徑,用逗號隔開。
@Data
@Configuration
@PropertySources({
@PropertySource(value = "classpath:important.properties", encoding = "utf-8"),
@PropertySource(value = "classpath:important.properties",encoding = "utf-8")
})
public class PropertySourcesConf {
@Value("${env.var1}")
private String var1;
@Value("${env.var2}")
private String var2;
}
五、YamlPropertiesFactoryBean 載入 YAML 文件
@Configuration
public class MyYamlConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer yamlConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("test.yml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
可以通過 @Value 註解或 Environment.getProperty() 方法來獲取其中定義的屬性值。
@Slf4j
@SpringBootTest
public class YamlTest {
@Value("${env.var3}")
private String var3;
@Test
public void myYamlTest() {
log.info("Yaml獲取配置內容:{}", var3);
}
}
六、JAVA原生讀取
@Slf4j
@SpringBootTest
public class CustomTest {
@Test
public void customTest() {
Properties props = new Properties();
try {
InputStreamReader inputStreamReader = new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream("test.properties"),
StandardCharsets.UTF_8);
props.load(inputStreamReader);
} catch (IOException e1) {
System.out.println(e1);
}
log.info("Properties Name:" + props.getProperty("env.appName"));
}
}
作者:京東零售 馬巨集偉
來源:京東雲開發者社區 轉載請註明來源