1. 程式人生 > >Spring Boot——讀取屬性檔案的多種方法

Spring Boot——讀取屬性檔案的多種方法

前言

在程式開發中,為了減少程式中的“硬編碼”,我們通常會將一些資訊放在屬性檔案中,再讀取到程式中。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"}]