详解如何为SpringBoot项目中的自定义配置添加IDE支持

导言

代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已 ——《计算机程序的构造和解释(SICP)》 导言

在我们的项目里经常会出现需要添加自定义配置的应用场景,例如某个开关变量,在测试环境打开,在生产环境不打开,通常我们都会使用下面的代码来实现,然后在Spring Boot配置文件中添加这个key和Value

Application.java:

application.properties

或者是没有使用@Value而直接在XML中使用我们配置的属性值

application.xml

这样的代码和配置在Spring Boot项目中可以正常启动并读取配置,但是在我们的IDE中却不会为我们提示配置的类型和代码补全。当我们有新同事到来,或者是需要为配置文件添加新的环境的支持的时候,我们很容易会把配置文件的Key拼错,或者Value的值与我们的变量类型并不兼容(实际上真的发生过这样的问题导致项目启动失败)。

但是在我们使用Spring Boot提供的配置的时候,IDE总是能为我们自动补全,告诉我们这个配置的变量类型,甚至是给我们把这个配置的描述显示出来。

我们是否也可以为我们自己写的配置添加这样的IDE支持呢?

配置项元数据(Configuration Metadata)

Spring Boot的Jar文件包含元数据文件,这些文件提供了我们所需要的配置属性的详细信息。IDE通过读取这些元数据文件,然后在使用application.properties或application.yml的时候提供上下文信息和代码补全。 那么只要知道如何编写并存放配置项元数据信息文件,我们也可以让IDE知道如何为我们的自定义配置提供上下文信息。

元数据格式

Spring Boot项目的配置项元数据文件都放在META-INF/spring-configuration-metadata.json中。下图是当我们配置好Spring Boot项目后默认使用的Spring Boot自动配置的配置项元数据存放的位置

配置项元数据文件按照groups, properties和hints组织。properties下的每个property都是程序中需要使用的配置项的key值,比如server.port是服务启动后的端口号。而我们可以将一些property按照某些规则组合起来,这个组合就是group(通常我们并不需要为properties组织对应的group)。而hints是为我们的配置项提供额外的信息,比如时区time.zone支持Asia/Shanghai,我们可以为它提供"Asia/Shanghai"的hint。

properties的参数

名称 类型 描述
name String 属性的全名。名称是小写字母以句点分割。此属性是必须的
type String 属性的数据类型的完整签名(java.lang.String),如果是范型的话还应当包含完整的范型参数(java.util.List<java.lang.String>)。为了保证一致性,需要使用包装类型来替代基本类型。此属性不是必须的,但是无法得到类型诊断的支持。

hints的参数

名称 类型 描述
name String 该提示所引用的属性的全称,和properties的name参数相同。此属性是必须的
values ValueHint[] ValueHint对象定义的有效值列表。每个条目都定义该值,并且可以具有描述

ValueHint的参数

名称 类型 描述
value Object property给定的类型的有效值,如果property的类型是数组,那么它也可以是值的数组。此属性是必须的。如果是Map类型的属性,可以使用.keys和.values来指定对应的有效值。
description String 和properties的description相同,提示给用户的简短描述。此属性不是必须的。

这里只展示了我们常用的参数,关于配置项元数据文件格式的详细信息可以看Spring Boot的官方文档 (https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-configuration-metadata.html#configuration-metadata-format

为自定义配置编写配置项元数据

接下来我们将对值、数组场景编写对应的配置项元数据,并为这些配置项添加提示(Talk is cheap,show me the code)

在IDE中实际使用的效果

不过这种方式虽然好,但是需要我们写很多的JSON配置来告诉IDE该如何进行代码补全和附加上下文信息,配置和代码还是处于分离的状态, 如果能通过写一个配置类,直接通过这个类和它的注释 就能为我们做到IDE支持就好了——Spring Boot开发者也是这么想的。

为代码自动生成配置项元数据

首先我们要改掉随处使用@Value的习惯,使用专门的数据类来存放我们的配置项

接下来我们创建一个Bean,让Spring Boot容器来接管这个类的实例

通过@ConfigurationProperties注解,Spring就会自动将配置注入到我们的配置Bean中,但是此时IDE还无法识别我们添加的自动配置,我们需要添加Spring Boot的注解处理器(annotation processor,从Java 1.6开始支持的特性)

添加注解处理器后重新编译,我们就会在target目录下看到自动生成的META-INF/spring-configuration-metadata.json

里面的内容基本就是我们之前自己手动输入的内容,只是受于Java代码表达信息的局限性,没有办法生成hints信息。其中sourceType和sourceMethod属性还可以帮助IDE跳转到我们声明这个配置的类和方法

如果我们想要让我们使用代码生成的配置类也能添加提示的话,可以在我们的META-INF目录下添加additional-spring-configuration-metadata.json文件,将hints写到这个文件里面

这样Spring Boot在编译的时候就会将我们的提示信息合并到配置信息元数据文件里面了

虽然这些工作不会增加代码的运行效率,但是让我们的配置集中起来并有IDE的加成,会让我们更改配置的时候更加有信心。正如开头所说的, 代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已。

到此这篇关于详解如何为SpringBoot项目中的自定义配置添加IDE支持的文章就介绍到这了,更多相关SpringBoot 添加IDE支持内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • intellij IDEA配置springboot的图文教程

    IntelliJ IDEA 简介 IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具(git.svn.github等).JUnit.CVS整合.代码分析. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主.它的旗舰版本还支持HTML,CSS,

  • SpringBoot 添加JSP 支持并附带在IDEA下创建JSP文件【测试无误】

    1添加 maven依赖 <!-- tomcat , jsp 的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.

  • IDEA SpringBoot项目配置热更新的步骤详解(无需每次手动重启服务器)

    IDEA SpringBoot项目配置热更新的步骤 1.在pom.xml中添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> 2.在pom.xml中添加插件: <

  • Springboot在IDEA热部署的配置方法

    1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- optional=true,依赖不会传递,该项目依赖devtools:之后依赖myboot项目的项目如果想要使用d

  • 详解如何为SpringBoot项目中的自定义配置添加IDE支持

    导言 代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已 --<计算机程序的构造和解释(SICP)> 导言 在我们的项目里经常会出现需要添加自定义配置的应用场景,例如某个开关变量,在测试环境打开,在生产环境不打开,通常我们都会使用下面的代码来实现,然后在Spring Boot配置文件中添加这个key和Value Application.java: application.properties 或者是没有使用@Value而直接在XML中使用我们配置的属性值 application.x

  • 详解如何在SpringBoot项目中使用全局异常处理

    目录 1. 创建自定义异常 2.创建全局异常处理器 3.创建测试控制器 在完整的项目开发中,异常的出现几乎是无法避免的:如果凡是有可能出现异常的地方,我们都手动的使用try-catch将其捕获的话,虽然也能达到处理异常的效果,但是这样做会使得代码显得十分臃肿并且后期不好维护,也不利于多人系统开发. 在Spring Boot中提供了统一处理异常的方法,SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用Exceptio

  • 详解如何在SpringBoot项目中使用统一返回结果

    目录 1.创建Spring Boot项目 2.返回结果的封装 3.后端接口实现 3.1 创建实体类 3.2 创建dao层 3.3 创建Controller层 4.前端部分 5.验证 在一个完整的项目中,如果每一个控制器的方法都返回不同的结果,那么对项目的维护和扩展都会很麻烦:并且现在主流的开发模式时前后端分离的模式,如果后端返回各式各样的结果,那么在前后端联调时会非常的麻烦,还会增加前后端的格外任务. 所以,在一个项目中统一返回结果就是一个十分必要和友好的做法.接下来就用一个简单的demo来看看

  • 详解如何将springboot项目导出成war包

    以demo-3项目为例: 1.将pom.xml中的jar改成war     2.添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> 3.移除插件 如果已经嵌入了tomcat插件,还要移除tomcat插件

  • 详解如何在vue项目中使用layui框架及采坑

    根据官网的文档,要在一个html文件下使用layui里面的组件库其实很简单,但是在vue项目中使用该ui库却存在着很多坑,下面我们就详细讲解一下如何在vue-cli搭建的项目下使用layui 1.第一个坑:vue项目中使用npm安装引入时报错(目前并没有找到引入的合适的方式,知道的可以留言探讨) 在官网中我们可以看到他提到支持npm安装,但是当我们安装成功后,在main.js中引入时却报并不能找到该模块的错. 所以,我们先下载文件包,然后在html文件中用link和script标签的方式引入 2

  • 详解如何在Vue项目中导出Excel

    Excel 导出 Excel 的导入导出都是依赖于js-xlsx来实现的. 在 js-xlsx的基础上又封装了Export2Excel.js来方便导出数据. 使用 由于 Export2Excel不仅依赖js-xlsx还依赖file-saver和script-loader. 所以你先需要安装如下命令: npm install xlsx file-saver -S npm install script-loader -S -D 由于js-xlsx体积还是很大的,导出功能也不是一个非常常用的功能,所以

  • 详解如何在NodeJS项目中优雅的使用ES6

    NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 项目地址:https://github.com/future-challenger/petshop 现在开始Babel 在开始使用Babel之前,假设 1.你已经安装了nodejs,并且已经熟悉了Js. 2.你也可以使用n

  • 详解如何在vue项目中引入elementUI组件

    前提:已经安装好Vue 初始化vue vue init webpack itemname 运行初始化demo 运行一下初始后的demo,如果没有问题则进行安装elementUI npm run dev 安装 elementUI npm i element-ui -S 引入elementUI 在main.js中引入elementUI import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vu

  • 详解Redis在SpringBoot工程中的综合应用

    目录 业务描述 准备工作 初始化数据 添加项目依赖 添加数据库访问配置 业务逻辑代码设计及实现 Domain对象设计 Dao 逻辑对象设计 Service 逻辑对象设计 Controller逻辑对象设计 总结(Summary) 业务描述 从一个博客数据库中查询所有的文章标签,然后存储到缓存(Cache),后续查询时可从缓存获取.提高其查询性能. 准备工作 初始化数据 初始化数据库中数据,SQL脚本如下: DROP DATABASE IF EXISTS `blog`; CREATE DATABAS

  • 详解如何去除vue项目中的#——History模式

    使用vue-cli搭建的环境,在配置好路由之后,可以看到下面的情况: 但是不难发现#的出现真的很丑陋,并且也不知道这是什么作用? 所以就去Stack Overflow上搜索了,果然还有~  看来Stack Overflow是真的强大,你在项目中遇到的问题实际上在so上都已经被问过并且解决了,这不:   这是最高票的回答,即在vue2中将mode模式设置为history,试过之后确实奏效! 但是知道这样可以解决问题,却不知道为什么,这是不行的, 随着连接,我们看到了文档. 所以这篇文章也就是引申到

随机推荐