Spring Boot的properties配置文件读取

我在自己写点东西玩的时候需要读配置文件,又不想引包,于是打算扣点Spring Boot读取配置文件的代码出来,当然只是读配置文件没必要这么麻烦,不过反正闲着也是闲着,扣着玩了。具体启动过程以前的博客写过Spring Boot启动过程(一),这次入口在SpringApplication类中:
    private ConfigurableEnvironment prepareEnvironment(
            SpringApplicationRunListeners listeners,
            ApplicationArguments applicationArguments) {
        // Create and configure the environment
        ConfigurableEnvironment environment = getOrCreateEnvironment();
        configureEnvironment(environment, applicationArguments.getSourceArgs());

    //此处读取
        listeners.environmentPrepared(environment);
        if (isWebEnvironment(environment)
                && this.webApplicationType == WebApplicationType.NONE) {
            environment = convertToStandardEnvironment(environment);
        }
        return environment;
    }

  关于监听器的过程在开头说的那篇的一系列中也说的挺细的,这里不介绍了:

  都是监听器相关的部分,略了,SpringApplicationRunListeners类中:

    public void environmentPrepared(ConfigurableEnvironment environment) {
        for (SpringApplicationRunListener listener : this.listeners) {
            listener.environmentPrepared(environment);
        }
    }

  EventPublishingRunListener:

  onApplicationEnvironmentPreparedEvent事件触发org\springframework\boot\spring-boot\2.0.0.BUILD-SNAPSHOT\spring-boot-2.0.0.BUILD-20170421.122111-547-sources.jar!\org\springframework\boot\context\config\ConfigFileApplicationListener.java监听器执行:

现在这个postProcessors中包含Json之类其他的监听器,不过我现在只想扣出properties的代码,别的先略过,反正其实也没什么,本来也是想看看它的思路,扣着玩,不要太在意。

    protected void addPropertySources(ConfigurableEnvironment environment,
            ResourceLoader resourceLoader) {
        RandomValuePropertySource.addToEnvironment(environment);
        new Loader(environment, resourceLoader).load();
    }

        Loader(ConfigurableEnvironment environment, ResourceLoader resourceLoader) {
            this.environment = environment;
            this.resourceLoader = resourceLoader == null ? new DefaultResourceLoader()
                    : resourceLoader;
        }
        this.classLoader = ClassUtils.getDefaultClassLoader();
        //其实也就是Thread.currentThread().getContextClassLoader();

  下面就是真正加载了配置文件的load方法了,先是初始化PropertySourcesLoader和一些临时的集合:

            this.propertiesLoader = new PropertySourcesLoader();
            this.activatedProfiles = false;
            this.profiles = Collections.asLifoQueue(new LinkedList<Profile>());
            this.processedProfiles = new LinkedList<>();

            // Pre-existing active profiles set via Environment.setActiveProfiles()
            // are additional profiles and config files are allowed to add more if
            // they want to, so don‘t call addActiveProfiles() here.
            Set<Profile> initialActiveProfiles = initializeActiveProfiles();
            this.profiles.addAll(getUnprocessedActiveProfiles(initialActiveProfiles));

  这些集合其实如果没配置Profile基本是没用的,这东西现在已经很少用到了,这个环境当然是没配的:

  主要是下面这部分:

                for (String location : getSearchLocations()) {
                    if (!location.endsWith("/")) {
                        // location is a filename already, so don‘t search for more
                        // filenames
                        load(location, null, profile);
                    }
                    else {
                        for (String name : getSearchNames()) {
                            load(location, name, profile);
                        }
                    }
                }

  就是去指定目录下去找各种以application为名字的指定类型的配置文件:

  我只关心application.properties,它是上面循环中的一次,走进了doLoadIntoGroup方法的下面那句:

    private Map<String, ?> loadProperties(Resource resource) throws IOException {
        String filename = resource.getFilename();
        if (filename != null && filename.endsWith(XML_FILE_EXTENSION)) {
            return (Map) PropertiesLoaderUtils.loadProperties(resource);
        }
        return new OriginTrackedPropertiesLoader(resource).load();
    }

  这个resource其实只是封装了一下InputStream,具体的读取。。。反正也没啥特别的读法:

  读出的key和value放在Map<String, OriginTrackedValue>:

    private void put(Map<String, OriginTrackedValue> result, String key,
            OriginTrackedValue value) {
        if (!key.isEmpty()) {
            result.put(key, value);
        }
    }

  以上。

==========================================================

咱最近用的github:https://github.com/saaavsaaa

微信公众号:

                      

时间: 2024-10-11 17:01:53

Spring Boot的properties配置文件读取的相关文章

Spring Boot加载配置文件的完整步骤

这篇文章主要给大家介绍了关于Spring Boot加载配置文件的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如: SpringBoot从哪里开始加载配置文件? SpringBoot从哪些地方加载配置文件? SpringBoot是如何支持yaml和proper

spring boot application.properties文件外部配置

spring boot application.properties文件外部配置 官方文档 原文地址:https://www.cnblogs.com/lwmp/p/9836791.html

Spring加载Properties配置文件的三种方式

一.通过 context:property-placeholder 标签实现配置文件加载 1) 用法: 1.在spring.xml配置文件中添加标签 <context:property-placeholder ignore-unresolvable="true" location="classpath:redis-key.properties"/> 2.在 spring.xml 中使用 配置文件属性:$ <!-- 基本属性 url.user.pas

Spring boot application.properties和 application.yml 初学者的学习

来自于java尚硅谷教程 简单的说这两个配置文件更改配置都可以更改默认设置的值比如服务器端口号之类的,只需再文件中设置即可, properties可能是出现的比较早了,如果你不调你的默认编码,中文可能乱码,yml则不会,至于在两个文件中写不同配置最终执行那个?我没试不得而知!总之都很好用! 说白了为了提高代码复用性是这样吧意思这个就是为了方便从配置文件中读值 例如你建立了一个bean类 别指望运行 Person.java package com.automavn.bean; import org

Spring Boot加载配置文件

问题1:Spring如何加载配置,配置文件位置? 1.默认位置: Spring Boot默认的配置文件名称为application.properties,SpringApplication将从以下位置加载application.properties文件,并把它们添加到Spring Environment中: 当前目录下的/config子目录, 当前目录. 一个classpath下的/config包 classpath根路径(root) 这个列表是按优先级排序的(列表中位置高的将覆盖位置低的).并

spring boot的application配置文件

  上次我们已经对这个文件见过面了,并且对他进行了一些简单的配置.它有两种配置方式,一个是application.properties,一个是application.yml文件,需要记住,当两个文件都存在的时候,spring boot默认使用的是application.properties文件.这个配置文件的名字不能变,就是application.但是在实际项目中,我们会有多个环境,每个环境中都有自己不一样的信息,这时候我们就需要用到多文件配置. 当时用多文件配置的时候,我们可以根据情况建立多个

spring boot application properties配置详解

#########COMMON SPRING BOOT PROPERTIES ######========CORE PROPERTIES=========== #SPRING CONFIG (ConfigFileApplicationListener) spring.config.name= # config file name (default to 'application')spring.config.location= # location of config file #PROFILE

Spring Boot application.properties

1 # =================================================================== 2 # COMMON SPRING BOOT PROPERTIES 3 # 4 # This sample file is provided as a guideline. Do NOT copy it in its 5 # entirety to your own application. ^^^ 6 # =======================

properties配置文件读取操作总结【java笔记】

声明:本文所有例子中的 properties 文件均放在 src 目录下,ecclipse 软件自动增加 一.基本概念 1.1  properties文件,存储格式 键=值. properties文件特点: 1.键值对格式 2." = "等号后面,值前面,的空格,会自动忽略掉 3.值后面的空格,不会忽略 4." = "等号后面的双引号,不会忽略 5." # "井号后面内容,为注释,忽略 1.2 Java的 Properties 类 属性映射(pr