SpringBoot读取外部的配置文件的代码实现

 更新时间:2024年11月28日 09:11:01   作者:墨momo  
这篇文章主要介绍了SpringBoot读取外部的配置文件的代码实现,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

一、使用场景

假设有一个买卖商品的系统,客户希望能灵活修改首页推荐商品的个数 num。

如果 num 是写在代码里的固定值,每次修改,开发人员就得重新将系统打包部署上线,费时费力。

但如果 num 是写在 jar 包的外部配置文件中,开发人员只需要修改该外部配置文件,然后重启已经部署上线的系统,就可以达到灵活修改 num 的效果啦。

二、代码实现

(一)application.yml 的配置

配置外部文件的路径,这里是 customer.yml,和 src 文件夹同级,如图。

customer:
  path: customer.yml

(二)编辑 customer.yml

这里配置了一个 num,值是 5

num: 5

(三)自定义方法读取外部配置文件

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 {

    @Override
    public 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);
        }
    }
}

(四)使用外部配置文件的配置

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 {
    @Autowired
    private 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 ''");
        }
    }
}

到此这篇关于SpringBoot读取外部的配置文件的代码实现的文章就介绍到这了,更多相关SpringBoot读取外部配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java获取Class对象的几种方式小结

    Java获取Class对象的几种方式小结

    本文给大家分享了Java获取Class对象的几种方式,使用类名.class 语法,使用对象的 getClass()方法,使用 Class.forName()方法等多种方法,不同的方式适用于不同的场景,需要的朋友可以参考下
    2023-10-10
  • 使用eclipse快速新建spirngboot项目的方法

    使用eclipse快速新建spirngboot项目的方法

    本篇文章主要介绍了使用eclipse快速新建spirngboot项目的方法,具有一定的参考价值,有兴趣的可以了解一下
    2017-04-04
  • 解决spring mvc 多数据源切换,不支持事务控制的问题

    解决spring mvc 多数据源切换,不支持事务控制的问题

    下面小编就为大家带来一篇解决spring mvc 多数据源切换,不支持事务控制的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • springboot vue 跨域问题的解决

    springboot vue 跨域问题的解决

    这篇文章主要介绍了springboot vue 跨域问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Java CharacterEncodingFilter过滤器的理解和配置案例详解

    Java CharacterEncodingFilter过滤器的理解和配置案例详解

    这篇文章主要介绍了Java CharacterEncodingFilter过滤器的理解和配置案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring boot中PropertySource注解的使用方法详解

    Spring boot中PropertySource注解的使用方法详解

    这篇文章主要给大家介绍了关于Spring boot中PropertySource注解的使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-12-12
  • 总结Bean的三种自定义初始化和销毁方法

    总结Bean的三种自定义初始化和销毁方法

    这篇文章主要介绍了Bean的三种自定义初始化和销毁方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • MyBatis超详细讲解如何实现分页功能

    MyBatis超详细讲解如何实现分页功能

    MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在,本篇文章带用它实现分页功能
    2022-03-03
  • Java应用EasyExcel工具类

    Java应用EasyExcel工具类

    这篇文章主要介绍了Java应用EasyExcel工具类,文中有非常详细的代码示例,对正在学习java的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-05-05
  • 浅谈Java Fork/Join并行框架

    浅谈Java Fork/Join并行框架

    这篇文章主要介绍了浅谈Java Fork/Join并行框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论