java中可通过继承propertysource实现自定义配置加载,如解析json文件并支持嵌套键、类型转换、占位符解析,需在spring boot启动前通过applicationcontextinitializer注册到environment,注意资源编码与加载顺序。

Java 配置文件中通过自定义 PropertySource 加载非标准属性文件,核心是继承 PropertySource> 或实现其子类(如 ResourcePropertySource 的思路),并重写 getProperty 方法来解析你自己的格式(比如 JSON、YAML、INI、数据库配置、加密内容等)。
定义自定义 PropertySource 子类
以加载 JSON 格式配置为例(如 app-config.json):
- 继承
PropertySource<resource></resource>,构造时传入资源路径和 Resource 对象 - 在
getProperty(String name)中读取并解析 JSON,支持嵌套键(如server.port→jsonObj.get("server").get("port")) - 内部缓存解析后的
Map<string object></string>,避免重复解析
注册到 Spring Environment
在 ApplicationContextInitializer 或 @Configuration 类中注入:
- 重写
initialize(ConfigurableApplicationContext ctx) - 获取
ConfigurableEnvironment,调用getPropertySources().addFirst(new YourJsonPropertySource("classpath:app-config.json")) - 注意顺序:放在
addFirst可覆盖默认配置;addLast则优先级最低
支持多层级键与类型转换
非标准格式常需额外处理:
- JSON/YAML 中的数字、布尔值、null 需转为对应 Java 类型(Spring 的
ConversionService可复用) - 支持扁平化键名(如
{"db": {"url": "jdbc:h2:mem:test"}}→db.url=jdbc:h2:mem:test) - 若含占位符(
${another.prop}),可委托给environment.resolvePlaceholders()解析
兼容 Spring Boot 自动配置
若用于 Spring Boot,建议配合 @ConfigurationProperties 使用:
- 确保自定义
PropertySource在SpringApplication.run()前注册(例如通过spring.factories中的ApplicationContextInitializer) - 避免与
@PropertySource冲突——后者只支持标准.properties或.xml,不识别自定义格式 - 调试时可通过
env.getPropertySources().forEach(ps -> System.out.println(ps.getName()))确认是否加载成功
不复杂但容易忽略的是资源路径解析和编码问题。建议统一用 ResourceLoader 获取 Resource,并显式指定 UTF-8 读取流,避免中文乱码或特殊字符解析失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











