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