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的截图如下
从截图中可以看出,所有的配置都有,只是分布在了两个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截图如下
II. 其他
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注
一灰灰blog
知识星球