spring boot 默认不支持 @propertysource 直接加载 json 文件,需自定义 propertysourcefactory 实现:解析 json 为 map、递归扁平化键(如 redis.host)、封装为 mappropertysource;仅启动时加载,不支持热刷新、profile 自动匹配及 @configurationproperties 直接绑定。

Spring Boot 默认不支持直接用 @PropertySource 加载 JSON 文件,但可以通过自定义 PropertySourceFactory 实现。核心思路是:让工厂类读取 JSON 内容,用 Jackson 或 FastJSON 解析为 Map,再封装成 PropertySource 注入环境。
写一个 JSON 解析工厂类
实现 PropertySourceFactory 接口,重写 createPropertySource 方法:
- 使用
ObjectMapper(Jackson)或JSONObject.parseObject()(FastJSON)解析 JSON 字符串 - 将解析后的
Map<string object></string>转为扁平化键值对(如{"db": {"url": "jdbc:h2:mem:test"}} → "db.url"="jdbc:h2:mem:test") - 构造
MapPropertySource,避免硬编码文件名或资源路径异常
在 @PropertySource 中指定 factory
在配置类或启动类上添加注解,指向自定义工厂:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
@Configuration
@PropertySource(value = "classpath:app.json", factory = JsonPropertySourceFactory.class)
public class AppConfig { }
-
value指向 classpath 下的 JSON 文件(如src/main/resources/app.json) -
factory必须是实现了PropertySourceFactory的具体类 - 注意:该方式只在 Spring 容器启动时加载一次,不支持热刷新
处理嵌套结构和数组
JSON 常含对象嵌套或数组,需递归扁平化:
- 例如:
{"redis": {"host": "localhost", "ports": [6379, 6380]}} - 应转为:
redis.host=localhost、redis.ports[0]=6379、redis.ports[1]=6380 - 可借助
FlatJsonParser工具类,或用 Jackson 的JsonNode遍历处理
注意事项与限制
这种方案适用于静态 JSON 配置,但有几点必须清楚:
- 不参与 Spring Boot 默认的 profile 激活逻辑(比如
app-dev.json不会自动按spring.profiles.active加载) - 加载顺序靠前,但优先级低于命令行参数和环境变量
- 若 JSON 文件不存在且未设
ignoreResourceNotFound = true,启动会失败 - 无法与
@ConfigurationProperties直接绑定复杂嵌套对象(需配合@Validated和自定义 converter)










