Spring Boot——讀取屬性檔案的多種方法
阿新 • • 發佈:2018-12-19
前言
在程式開發中,為了減少程式中的“硬編碼”,我們通常會將一些資訊放在屬性檔案中,再讀取到程式中。Spring 提供了多種便利的方法幫助我們從屬性檔案中讀取資料。
一、屬性檔案載入
程式預設載入application.yml(或application.properties)屬性檔案。如需要載入其它屬性檔案使用@PropertySource
註解:
例如: 載入user.properties檔案
@PropertySource("user.properties")
載入完屬性檔案後我們可以通過以下集中方式獲取屬性設定的值
二、讀取屬性值的方式
1、Environment檢索屬性
@Autowired private Environment env; @Bean @Qualifier("env") public User getUserByEnv() { User user = new User(); // 獲取屬性值 user.setUsername(env.getProperty("com.xzx.username")); user.setSay(env.getProperty("com.xzx.say")); return user ; }
Environment類對屬性的操作有多種方法,比如對null屬性賦予預設值,按指定資料型別讀取屬性,檢查屬性是否存在等;具體可以詳細瞭解Environmentment類
2、@ConfigurationProperties方式
使用@configuration註解可以讀取檔案中的屬性,根據屬性key自動為Bean賦值;如下我們注入一個User bean並通過該註解為其屬性賦值。
注:User bean的屬性名與檔案中的屬性名一致;
@Bean @Qualifier("conPro") @ConfigurationProperties(prefix="com.xzx") public User getUserByCP() { return new User(); }
User.java
package com.facets.core.entity; public class User { private String username; private String say; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSay() { return say; } public void setSay(String say) { this.say = say; } }
3、@Value方式
我們還可以使用屬性佔位符的方式獲取屬性值;
@Value("${com.xzx.username}")
private String username;
@Value("${com.xzx.say}")
private String say;
@Bean
@Qualifier("value")
public User getUserByValue() {
User user = new User();
user.setUsername(username);
user.setSay(say);
return user ;
}
以上三種方式合併檔案為
package com.facets.core.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import com.facets.core.entity.User;
@Configuration
// 預設載入application屬性檔案
@PropertySource(value="user.properties")
public class UserConfig {
@Autowired
private Environment env;
@Bean
@Qualifier("env")
public User getUserByEnv() {
User user = new User();
user.setUsername(env.getProperty("com.xzx.username"));
user.setSay(env.getProperty("com.xzx.say"));
return user ;
}
@Bean
@Qualifier("conPro")
@ConfigurationProperties(prefix="com.xzx")
public User getUserByCP() {
return new User();
}
@Value("${com.xzx.username}")
private String username;
@Value("${com.xzx.say}")
private String say;
@Bean
@Qualifier("value")
public User getUserByValue() {
User user = new User();
user.setUsername(username);
user.setSay(say);
return user ;
}
}
三、測試
屬性檔案user.properties
com.xzx.username=xzx
com.xzx.say=hello worldFacets
FacetsApplication.java
package com.facets.core;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.facets.core.entity.User;
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
@RestController
public class FacetsApplication {
@Autowired
@Qualifier("env")
private User user;
@Autowired
@Qualifier("conPro")
private User user1;
@Autowired
@Qualifier("value")
private User user2;
@RequestMapping("/test")
public List<User> getUser() {
List<User> list = new ArrayList<>();
list.add(user);
list.add(user1);
list.add(user2);
return list;
}
public static void main(String[] args) {
SpringApplication.run(FacetsApplication.class, args);
}
}
輸出:
[{"username":"xzx","say":"hello world"},{"username":"xzx","say":"hello world"},{"username":"xzx","say":"hello world"}]