欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot的properties配置文件读取

程序员文章站 2023-12-19 09:26:04
我在自己写点东西玩的时候需要读配置文件,又不想引包,于是打算扣点spring boot读取配置文件的代码出来,当然只是读配置文件没必要这么麻烦,不过反正闲着也是闲着,扣着玩...

我在自己写点东西玩的时候需要读配置文件,又不想引包,于是打算扣点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;
  }

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

Spring Boot的properties配置文件读取

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

  public void environmentprepared(configurableenvironment environment) {
    for (springapplicationrunlistener listener : this.listeners) {
      listener.environmentprepared(environment);
    }
  }

eventpublishingrunlistener:

Spring Boot的properties配置文件读取

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监听器执行:

Spring Boot的properties配置文件读取

 Spring Boot的properties配置文件读取

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

Spring Boot的properties配置文件读取

  protected void addpropertysources(configurableenvironment environment,
      resourceloader resourceloader) {
    randomvaluepropertysource.addtoenvironment(environment);
    new loader(environment, resourceloader).load();
  }

Spring Boot的properties配置文件读取

    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基本是没用的,这东西现在已经很少用到了,这个环境当然是没配的:

Spring Boot的properties配置文件读取

主要是下面这部分:

        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为名字的指定类型的配置文件:

Spring Boot的properties配置文件读取

Spring Boot的properties配置文件读取

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

Spring Boot的properties配置文件读取

Spring Boot的properties配置文件读取

Spring Boot的properties配置文件读取

  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,具体的读取。。。反正也没啥特别的读法:

Spring Boot的properties配置文件读取

读出的key和value放在map<string, origintrackedvalue>: 

  private void put(map<string, origintrackedvalue> result, string key,
      origintrackedvalue value) {
    if (!key.isempty()) {
      result.put(key, value);
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: