SpringBoot之获取Application.yml配置参数
需要获取配置文件中的配置参数的场景挺多的,常见的一种方式就是直接从Enironment对象中获取,或者使用 @Value 注解的方式注入,但是这都有一个前提,需要确切的知道配置的name
如果某些场景下,我需要遍历配置参数可以怎么办?
I. 获取配置参数
首先可以明确的一点就是通过Environment可以获取所有的配置(不然怎么根据配置名获取配置参数?!),所以问题的关键就是如何捞出Environment中的数据了,
因此第一步就是需要获取Environment对象,然后看Environment对象中是否提供了类似的接口,直接看接口定义,没有直接获取所有配置的接口(不然也就不会写这个东西了),没办法,只能开启debug模式,看数据了
| 12
 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的截图如下

从截图中可以看出,所有的配置都有,只是分布在了两个PropertySource中,一个是名为application.yml,另外一个就是名为application-dev.yml
正好和我们项目实际使用的配置文件对应上了,一个是基本的,一个是分环境的配置,所以思路就来了,直接根据name找到对应的配置容器,然后捞出来即可
简单的实现如下
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | @Autowiredpublic 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截图如下

II. 其他
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注
一灰灰blog

知识星球
