zoukankan      html  css  js  c++  java
  • Spring Boot 获取yaml配置文件信息

    Spring boot 项目启动过程中:

    org.springframework.boot.SpringApplication#prepareEnvironment

    当程序步入listeners.environmentPrepared(environment);这里后,就会读取配置文件中信息。

    private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
                ApplicationArguments applicationArguments) {
            // Create and configure the environment
            ConfigurableEnvironment environment = getOrCreateEnvironment();
            configureEnvironment(environment, applicationArguments.getSourceArgs());
            listeners.environmentPrepared(environment);
            bindToSpringApplication(environment);
            if (!this.isCustomEnvironment) {
                environment = new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,
                        deduceEnvironmentClass());
            }
            ConfigurationPropertySources.attach(environment);
            return environment;
        }

    这句代码不好调试listeners.environmentPrepared(environment); 

    但可以换一种方式,找到上图中的这个类:org.springframework.boot.env.OriginTrackedMapPropertySource

     在断点处打上断点,就可以看到系统是如何运行的:下面是堆栈信息

    在堆栈信息中,可以看到这个类:org.springframework.boot.context.config.ConfigFileApplicationListener

    这个类里面的包含一些配置信息:

    private static final String DEFAULT_PROPERTIES = "defaultProperties";
    
        // Note the order is from least to most specific (last one wins)
        private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
    
        private static final String DEFAULT_NAMES = "application";
    
        private static final Set<String> NO_SEARCH_NAMES = Collections.singleton(null);
    
        private static final Bindable<String[]> STRING_ARRAY = Bindable.of(String[].class);
    
        /**
         * The "active profiles" property name.
         */
        public static final String ACTIVE_PROFILES_PROPERTY = "spring.profiles.active";
    
        /**
         * The "includes profiles" property name.
         */
        public static final String INCLUDE_PROFILES_PROPERTY = "spring.profiles.include";
    
        /**
         * The "config name" property name.
         */
        public static final String CONFIG_NAME_PROPERTY = "spring.config.name";
    
        /**
         * The "config location" property name.
         */
        public static final String CONFIG_LOCATION_PROPERTY = "spring.config.location";

    一个properties. 一个yaml配置sourceloader

    加载yaml文件的类是YamlPropertySourceLoader

    public class YamlPropertySourceLoader implements PropertySourceLoader {
    
        @Override
        public String[] getFileExtensions() {
            return new String[] { "yml", "yaml" };
        }
    
        @Override
        public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
            if (!ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) {
                throw new IllegalStateException(
                        "Attempted to load " + name + " but snakeyaml was not found on the classpath");
            }
            List<Map<String, Object>> loaded = new OriginTrackedYamlLoader(resource).load();
            if (loaded.isEmpty()) {
                return Collections.emptyList();
            }
            List<PropertySource<?>> propertySources = new ArrayList<>(loaded.size());
            for (int i = 0; i < loaded.size(); i++) {
                String documentNumber = (loaded.size() != 1) ? " (document #" + i + ")" : "";
                propertySources.add(new OriginTrackedMapPropertySource(name + documentNumber, loaded.get(i)));
            }
            return propertySources;
        }
    
    }

    注如果是云环境,则首先加载的是bootstrap.yml, environment也是StandardEnvironment,非servlet环境。这是和Spring boot有很大的不同,加载完成后,再嵌套一StandardServletEnvironment.

     

     加载完成后,再嵌套一StandardServletEnvironment.

  • 相关阅读:
    Windows 10 Universal App 开发记录
    Windows Phone 8.1 开发会用到的方法
    Android Activity设置全屏
    Android视频录制命令screenrecord
    Android ScrollView中嵌套ListView只显示一行的解决办法
    Android 4.4.4: java.lang.SecurityException: Package com.android.settings does not belong to 1001
    自定义Android spinner样式并添加监听事件
    GSON快速实现内部类
    android的Banner轮播图框架
    Okhttp与Okhttputils的用法及区别
  • 原文地址:https://www.cnblogs.com/hankuikui/p/11854954.html
Copyright © 2011-2022 走看看