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中HashMap的原理分析

    java中HashMap的原理分析

    HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap。详细地阐述HashMap中的几个概念,并深入探讨HashMap的内部结构和实现细节,讨论HashMap的性能问题
    2016-03-03
  • SpringBoot自动装配原理及配置流程

    SpringBoot自动装配原理及配置流程

    SpringBoot通过@SpringBootApplication注解,结合配置文件与@Conditional条件,自动识别并加载Bean,实现简化配置与环境适配,本文给大家介绍SpringBoot自动装配原理及配置流程,感兴趣的朋友一起看看吧
    2025-08-08
  • java 分布式与集群的区别和联系

    java 分布式与集群的区别和联系

    本文主要介绍了java分布式与集群的区别和联系,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • SpringBoot集成JWT实现登陆验证的方法详解

    SpringBoot集成JWT实现登陆验证的方法详解

    JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间以JSON对象安全地传输信息。本文将利用SpringBoot集成JWT实现登陆验证,感兴趣的可以了解一下
    2022-05-05
  • Spring boot外部配置(配置中心化)详解

    Spring boot外部配置(配置中心化)详解

    这篇文章主要给大家介绍了关于Spring boot外部配置(配置中心化)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • 使用eclipse 实现将springboot项目打成jar包

    使用eclipse 实现将springboot项目打成jar包

    这篇文章主要介绍了使用eclipse 实现将springboot项目打成jar包的流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 在springboot3微项目中如何用idea批量创建单元测试逻辑

    在springboot3微项目中如何用idea批量创建单元测试逻辑

    这篇文章主要介绍了在SpringBoot3项目中使用IntelliJIDEA批量创建单元测试包括准备工作(确保项目配置正确,添加测试依赖),使用IntelliJIDEA创建测试,感兴趣的朋友一起看看吧
    2024-10-10
  • Java 多用户登录限制的实现方法

    Java 多用户登录限制的实现方法

    最近没有事情做,闲的发呆,于是写个东东练练手。这篇文章主要介绍了Java 多用户登录限制的实现方法的相关资料,需要的朋友可以参考下
    2016-11-11
  • SpringBoot中通过8项配置优化提升Tomcat性能的配置方法

    SpringBoot中通过8项配置优化提升Tomcat性能的配置方法

    优化Spring Boot,Spring Cloud 应用程序中Tomcat的配置有助于提高性能和资源利用率,这篇文章主要介绍了SpringBoot中通过8项配置优化提升Tomcat性能的配置方法,需要的朋友可以参考下
    2024-08-08
  • Java实现茶叶售卖商城系统(java+SSM+JSP+EasyUi+mysql)

    Java实现茶叶售卖商城系统(java+SSM+JSP+EasyUi+mysql)

    这篇文章主要介绍了基于SSM框架实现的一个茶叶售卖商城系统,应用到的技术有Jsp、SSM 、EasyUi,文中的示例代码具有一定的学习价值,需要的朋友可以参考一下
    2021-12-12

最新评论