https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/html/appendix-configuration-metadata.html#configuration-metadata-annotation-processor

1. 开发中有个东西很好

在开发Spring应用的时候, 经常会给应用添加各种配置属性,
有些第三方包的配置属性很贴心, 配合Idea, 鼠标悬浮在上面就会提示你这个属性是干什么的

例如:

  • 在properties文件中编辑的时候, 鼠标悬浮在属性上的弹框

image.png

  • 自动补全弹框中, 括号里的注释

image.png

2. IDEA是从哪读取到这个注释的呢?

Idea会自动读取 META-INF/spring-configuration-metadata.json这个文件, 获取其中的信息
大家有缘可以看看
spring-boot-actuator-autoconfigure 这个jar包中的 \META-INF\spring-configuration-metadata.json
image.png
其中就有很多的注释

3. 我项目中的属性也想有注释自动提示

好了, 现在知道了IDE会自动读取 META-INF/spring-configuration-metadata.json

我也想搞一个, 那我是不是也要手写一个这个文件呢? 写起来还挺麻烦的

其实不需要, spring已经给我们提供了一个工具

  • spring-boot-configuration-processor.jar

我们的项目直接依赖它, 编译之后(包括打jar包) 就会自动生成 META-INF/spring-configuration-metadata.json

下面我们就来介绍一下如何使用:

3.1 添加Maven依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-configuration-processor</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  • 添加maven插件
    1. <project>
    2. <build>
    3. <plugins>
    4. <plugin>
    5. <groupId>org.springframework.boot</groupId>
    6. <artifactId>spring-boot-maven-plugin</artifactId>
    7. <configuration>
    8. <excludes>
    9. <!-- 添加了这个排除项, 编译后的jar包中就不会有spring-boot-configuration-processor的依赖了 -->
    10. <!-- 只会剩下 META-INF/spring-configuration-metadata.json 文件 -->
    11. <!-- spring-boot-configuration-processor 生成好文件之后历史任务就完成了, 自己被排除掉, 不会影响 引用本项目 的 其他项目 -->
    12. <exclude>
    13. <groupId>org.springframework.boot</groupId>
    14. <artifactId>spring-boot-configuration-processor</artifactId>
    15. </exclude>
    16. </excludes>
    17. </configuration>
    18. </plugin>
    19. </plugins>
    20. </build>
    21. </project>

    3.2 给你的配置项添加javadoc

例如:

  1. @Data
  2. @ConfigurationProperties("acme")
  3. public class AcmeProperties {
  4. /**
  5. * 是否检查位置信息
  6. */
  7. private boolean checkLocation = true;
  8. /**
  9. * 登录超时时间
  10. */
  11. private Duration loginTimeout = Duration.ofSeconds(3);
  12. }
  1. /**
  2. * 用这种标记包裹起来的注释, 就是javadoc
  3. * spring-boot-configuration-processor 只对javadoc起作用
  4. */

3.3 编译

当我们添加好注释之后, 正常进行编译后就会自动生成 META-INF/spring-autoconfigure-metadata.properties文件

4. 用起来效果

  • 我直接使用maven对项目编译

    1. mvn clean install
  • 编译之后就有了 META-INF/spring-autoconfigure-metadata.properties 文件了, 是不是很方便呢

image.png

  • 再看看打的jar包中是否还依赖着 spring-boot-configuration-processor

image.pngimage.png

OK啦家人们! spring-boot-configuration-processor 是我们的无名英雄!