SpringBoot之获取Application.yml配置参数

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

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

I. 获取配置参数

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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找到对应的配置容器,然后捞出来即可

简单的实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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

知识星球

goals