【springboot】读取外部的配置文件
- 一、使用场景
- 二、代码实现
- (一)application.yml 的配置
- (二)编辑 customer.yml
- (三)自定义方法读取外部配置文件
- (四)使用外部配置文件的配置
一、使用场景
假设有一个买卖商品的系统,客户希望能灵活修改首页推荐商品的个数 num
。
如果 num
是写在代码里的固定值,每次修改,开发人员就得重新将系统打包部署上线,费时费力。
但如果 num
是写在 jar
包的外部配置文件中,开发人员只需要修改该外部配置文件,然后重启已经部署上线的系统,就可以达到灵活修改 num
的效果啦。
二、代码实现
(一)application.yml 的配置
配置外部文件的路径,这里是 customer.yml
,和 src
文件夹同级,如图。
customer:path: customer.yml
(二)编辑 customer.yml
这里配置了一个 num
,值是 5
num: 5
(三)自定义方法读取外部配置文件
java">import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;import java.io.File;
import java.util.Properties;public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {//自定义配置文件,对应 application.yml 里的前缀String profiles = environment.getProperty("customer.path");//加载成PropertySource对象,并添加到Environment环境中File file = new File(profiles);Resource resource = new FileSystemResource(file);environment.getPropertySources().addLast(loadProfiles(resource));}/*** 加载单个配置文件* @param resource* @return*/private PropertySource<?> loadProfiles(Resource resource) {// 判断资源是否存在if (!resource.exists()) {throw new IllegalArgumentException("资源" + resource + "不存在");}// 判断后缀名,兼容 .yml 文件和 .properties 文件if (resource.getFilename().contains(".yml")) {return loadYaml(resource);} else {return loadProperty(resource);}}/*** 加载properties格式的配置文件** @param resource* @return*/private PropertySource loadProperty(Resource resource) {try {//从输入流中加载一个Properties对象Properties properties = new Properties();properties.load(resource.getInputStream());return new PropertiesPropertySource(resource.getFilename(), properties);} catch (Exception ex) {throw new IllegalStateException("加载配置文件失败" + resource, ex);}}/*** 加载yml格式的配置文件** @param resource* @return*/private PropertySource loadYaml(Resource resource) {try {YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();factory.setResources(resource);//从输入流中加载一个Properties对象Properties properties = factory.getObject();return new PropertiesPropertySource(resource.getFilename(), properties);} catch (Exception ex) {throw new IllegalStateException("加载配置文件失败" + resource, ex);}}
}
(四)使用外部配置文件的配置
java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@Autowiredprivate Environment environment;@GetMapping("/test")public void test() {// 读取 num 配置值,不为空则输出String num = environment.getProperty("num");if (num != null && !num.equals("")) {System.out.println("num = " + num);} else {System.out.println("num is null or ''");}}
}