美文网首页JAVA随笔码农日历
180830-SpringBoot之获取application.

180830-SpringBoot之获取application.

作者: 一灰灰blog | 来源:发表于2018-08-31 08:30 被阅读0次

SpringBoot之获取Application.yml配置参数

需要获取配置文件中的配置参数的场景挺多的,常见的一种方式就是直接从Enironment对象中获取,或者使用 @Value 注解的方式注入,但是这都有一个前提,需要确切的知道配置的name

如果某些场景下,我需要遍历配置参数可以怎么办?

I. 获取配置参数

首先可以明确的一点就是通过Environment可以获取所有的配置(不然怎么根据配置名获取配置参数?!),所以问题的关键就是如何捞出Environment中的数据了,

因此第一步就是需要获取Environment对象,然后看Environment对象中是否提供了类似的接口,直接看接口定义,没有直接获取所有配置的接口(不然也就不会写这个东西了),没办法,只能开启debug模式,看数据了

package com.github.hui.story.quickstory;

import com.git.hui.story.cache.redis.QuickRedisClient;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication(scanBasePackages = {"com.git.hui.story", "com.github.hui.story"})
@MapperScan(basePackages = "com.git.hui.story.dao.mapper")
@ServletComponentScan
@EnableScheduling
@Slf4j
public class QuickStoryApplication extends SpringBootServletInitializer {

    @Autowired
    public void setEnvironment(Environment environment) {
        String host = environment.getProperty("spring.redis.host");
        log.info("host: {}", host);
    }

    @Autowired
    public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
        QuickRedisClient.register(redisTemplate);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(QuickStoryApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(QuickStoryApplication.class, args);
    }
}

上面的代码中,只需要关注下setEnvironment方法即可,其他的就没什么关系了,debug的截图如下

1

从截图中可以看出,所有的配置都有,只是分布在了两个PropertySource中,一个是名为application.yml,另外一个就是名为application-dev.yml

正好和我们项目实际使用的配置文件对应上了,一个是基本的,一个是分环境的配置,所以思路就来了,直接根据name找到对应的配置容器,然后捞出来即可

简单的实现如下

@Autowired
public void setEnvironment(Environment environment) {
    String host = environment.getProperty("spring.redis.host");
    log.info("host: {}", host);

    PropertySource source = ((StandardServletEnvironment) environment).getPropertySources()
            .get("applicationConfig: [classpath:/application.yml]");
    Map<String, String> appMap = (Map<String, String>) source.getSource();


    if (environment.getActiveProfiles().length > 0) {
        PropertySource activeSource = ((StandardServletEnvironment) environment).getPropertySources()
                .get("applicationConfig: [classpath:/application-" + environment.getActiveProfiles()[0] +
                        ".yml]");
        Map<String, String> activeAppMap = (Map<String, String>) activeSource.getSource();
        appMap.putAll(activeAppMap);
    }

    log.info("config: {}", appMap);
}

再次debug截图如下

2.jpg

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

zhishi

相关文章

网友评论

    本文标题:180830-SpringBoot之获取application.

    本文链接:https://www.haomeiwen.com/subject/gwgjwftx.html