SpringBoot运行时如何获取已加载配置文件并注入Bean?
获取SpringBoot已加载配置文件并注入Bean的方案
核心结论
可以将已加载的application.properties/application.yaml相关信息注入到Bean中,用于日志记录排查配置冲突问题。
具体实现方案
1. 通过ConfigurableEnvironment获取配置源
SpringBoot的ConfigurableEnvironment包含了所有加载的配置源,直接注入这个对象就能遍历提取配置文件信息:
import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertySource; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Configuration public class ConfigFileLogger { private static final Logger logger = LoggerFactory.getLogger(ConfigFileLogger.class); private final ConfigurableEnvironment environment; public ConfigFileLogger(ConfigurableEnvironment environment) { this.environment = environment; } @PostConstruct public void logConfigFiles() { logger.info("=== 已加载的配置文件列表 ==="); for (PropertySource<?> propertySource : environment.getPropertySources()) { // 筛选类路径、文件系统下的application开头配置文件 if (propertySource.getName().startsWith("classpath:/application") || propertySource.getName().startsWith("file:/application")) { logger.info("配置源: {}, 类型: {}", propertySource.getName(), propertySource.getClass().getSimpleName()); } } } }
这段代码会在Bean初始化后,打印所有符合条件的配置文件,帮你快速定位依赖JAR中误打包的配置文件。
2. 精准识别配置文件源
如果需要更精准识别Properties或YAML类型的配置源,可以判断具体实现类:
import org.springframework.core.io.support.ResourcePropertySource; // 在遍历逻辑中添加判断 if (propertySource instanceof ResourcePropertySource resourcePropertySource) { String resourcePath = resourcePropertySource.getResource().getDescription(); if (resourcePath.contains("application.properties") || resourcePath.contains("application.yaml") || resourcePath.contains("application.yml")) { logger.info("已加载配置文件: {}", resourcePath); } }
这种方式能过滤掉无关配置源,只保留目标文件的加载信息。
3. 注意事项
- 配置源的打印顺序和SpringBoot的外部配置优先级一致,后加载的源会覆盖先加载的配置。
- 多环境配置(如
application-dev.properties)也会被识别,如需过滤可调整判断条件。 - 方案适用于SpringBoot 2.x及以上版本,3.x版本需注意将
javax相关包替换为jakarta。
内容的提问来源于stack exchange,提问作者nauni77
相关产品推荐
相关产品推荐

