【Spring Boot 应用开发】-06 自动配置-生成配置元数据

Spring Boot Configuration Processor 使用指南

一、概述

spring-boot-configuration-processor 是 Spring Boot 提供的一个用于编译期处理 @ConfigurationProperties 注解的模块。它的主要作用是生成配置元数据文件(spring-configuration-metadata.json),用于增强开发体验,例如:

  • 在 IDE 中为配置文件(application.yml / application.properties)提供自动补全、文档提示。
  • 提供类型、默认值、描述等信息,方便配置管理和排查错误。

具体是干啥呢?举个例子,比如你在yml中自定义了一个token配置的配置项,如下:

发现了一个提示:Cannot resolve configuration property 'jwt.token.secret',无法解析配置属性"jwt.token.secrete" ,你点击它,也不会跳转到对应的配置类去。这和一些springboot自带的自动配置属性为什么不一样?其实就是没有依赖spring-boot-configuration-processor,依赖它,就OK了

二、引入依赖

在 Maven 项目中加入如下依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional> <!-- 编译期依赖,不传递 -->
</dependency>

或者使用 provided scope(可选):

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <scope>provided</scope>
</dependency>

注意:Gradle 用户应添加:

groovy 复制代码
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

三、使用方式

  1. 创建配置类,并使用 @ConfigurationProperties 注解标记:
java 复制代码
@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {

    /**
     * 服务名称
     */
    private String name;

    /**
     * 超时时间(秒)
     */
    private int timeout = 30;

    // Getter / Setter
}
  1. 注册该配置类(任选一种方式):
  • 使用 @EnableConfigurationProperties
java 复制代码
@EnableConfigurationProperties(MyServiceProperties.class)
@Configuration
public class AppConfig {}
  • 或者直接用 @Component 注解让其被 Spring 扫描:
java 复制代码
@Component
@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {}

四、生成的文件说明

编译后会自动在 target/classes/META-INF/ 目录下生成:

复制代码
spring-configuration-metadata.json

这个文件包含了配置类中的每个字段的元数据,如:

json 复制代码
{
  "name": "my.service.timeout",
  "type": "java.lang.Integer",
  "defaultValue": 30,
  "description": "超时时间(秒)"
}

该文件被 IDEA 和其他支持 Spring Boot 的工具识别并用于配置提示。


五、常见问题

1. 没有提示怎么办?

  • 确保使用了 @ConfigurationProperties,不是 @Value
  • 确保类已注册为 Spring Bean(通过 @Component@EnableConfigurationProperties)。
  • 检查是否已引入 spring-boot-configuration-processor 并正确编译生成 metadata。
  • 确保项目已 重新构建(Rebuild),并非仅增量编译。

2. 如何为字段添加描述?

使用 JavaDoc 注释即可自动写入 metadata 提示中:

java 复制代码
/**
 * 是否启用缓存
 */
private boolean cacheEnabled;

六、适用版本

  • spring-boot-configuration-processor 通常与 Spring Boot 主版本一致。例如:
    • Spring Boot 3.2.x ⇒ 使用 spring-boot-configuration-processor:3.2.x
    • Spring Boot 2.7.x ⇒ 使用 spring-boot-configuration-processor:2.7.x

七、总结

优点 描述
配置补全 在 IDE 中自动提示可配置项
自动生成文档 生成描述信息、默认值等
类型安全 配置类支持类型校验、校验注解支持
编译期处理,运行时无影响 不会影响程序运行,只在开发时生效

s‍pring-configuration-metadata.json 的工作原理是基于注解处理器(Annotation Processor)机制 ,在编译期自动生成配置属性的元数据文件,供开发工具(比如 IntelliJ IDEA 或 VS Code)使用,用于提供配置提示、文档说明、默认值等功能。


八、 🌱 工作原理详解

1. 基于注解处理器(Annotation Processor)

spring-boot-configuration-processor 的模块,其中内置了一个注解处理器,它会在 Java 编译时扫描你的代码:

  • 查找所有使用了 @ConfigurationProperties 注解的类。
  • 提取类中的字段、JavaDoc 注释、默认值、类型信息。
  • 将这些信息生成 JSON 格式的元数据。

这个注解处理器符合 Java 标准的 APT(Annotation Processing Tool)机制。


2. 编译期生成 spring-configuration-metadata.json

编译时,该 Processor 会在你的项目输出目录生成:

复制代码
target/classes/META-INF/spring-configuration-metadata.json

里面的内容大致如下:

json 复制代码
{
  "properties": [
    {
      "name": "my.service.timeout",
      "type": "java.lang.Integer",
      "defaultValue": 30,
      "description": "超时时间(秒)"
    }
  ]
}

这不是被 Spring Boot 应用读取的文件,而是给 IDE / 开发工具 用的。


3. IDE 如何使用?

像 IntelliJ IDEA、VS Code 这类工具,会在你打开 application.yml / application.properties 时:

  • 扫描 classpath 下的 META-INF/spring-configuration-metadata.json
  • 加载其中的 nametypedescription
  • 然后在你输入配置项时,提供自动补全、类型提示、文档说明等

例如:

yaml 复制代码
my.service.timeout: 30
# ↑ IDE 会提示 "超时时间(秒)", 类型为 Integer,默认值 30

4. 开发者还能做什么?

你可以通过自定义 additional-spring-configuration-metadata.json 来补充额外的配置项提示(比如没有显式定义的配置项,如 SPI 加载的类)。

放置位置:

复制代码
src/main/resources/META-INF/additional-spring-configuration-metadata.json

格式与自动生成的 JSON 相同。


✅ 总结流程图:

text 复制代码
@ConfigProps类 + spring-boot-configuration-processor
              ↓
       编译期注解处理器(APT)
              ↓
  生成 spring-configuration-metadata.json
              ↓
        IDE 读取该文件 → 提供自动补全 & 文档提示

相关推荐
wgc2k16 分钟前
Java游戏服务器开发流水账(4)游戏的数据持久化
java·服务器·游戏
向哆哆16 分钟前
Spring 框架实战:如何实现高效的依赖注入,优化项目结构?
java·spring·log4j
忘梓.19 分钟前
从父类到子类:C++ 继承的奇妙旅程(2)
java·开发语言·c++
小杜-coding4 小时前
黑马点评day04(分布式锁-setnx)
java·spring boot·redis·分布式·spring·java-ee·mybatis
caihuayuan55 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计
佩奇的技术笔记6 小时前
Java学习手册:单体架构到微服务演进
java·微服务·架构
Kookoos6 小时前
ABP vNext + EF Core 实战性能调优指南
数据库·后端·c#·.net·.netcore
zm7 小时前
服务器多客户端连接核心要点(1)
java·开发语言
FuckPatience7 小时前
关于C#项目中 服务层使用接口的问题
java·开发语言·c#
天上掉下来个程小白7 小时前
缓存套餐-01.Spring Cache介绍和常用注解
java·redis·spring·缓存·spring cache·苍穹外卖