您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
如何在SpringBoot项目中为配置添加IDE支持
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
如何在SpringBoot项目中为配置添加IDE支持
自猿其说Tech
2021-03-02
IP归属:未知
2969浏览
计算机编程
**代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已 ——《计算机程序的构造和解释(SICP)》** ------------ #### 导言 在我们的项目里经常会出现需要添加自定义配置的应用场景,例如某个开关变量,在测试环境打开,在生产环境不打开,通常我们都会使用下面的代码来实现,然后在Spring Boot配置文件中添加这个key和Value ##### Application.java: ![](//img1.jcloudcs.com/developer.jdcloud.com/05049d23-0605-4ef7-8635-dc029737fca220210302102803.png) ##### application.properties ![](//img1.jcloudcs.com/developer.jdcloud.com/26b09590-46e1-4646-a8d9-c7131188284420210302102832.png) 或者是没有使用@Value而直接在XML中使用我们配置的属性值 ##### application.xml ![](//img1.jcloudcs.com/developer.jdcloud.com/ef3dd761-261f-4111-bc22-a7e472f8214620210302102910.png) 这样的代码和配置在Spring Boot项目中可以正常启动并读取配置,但是在我们的IDE中却不会为我们提示配置的类型和代码补全。当我们有新同事到来,或者是需要为配置文件添加新的环境的支持的时候,我们很容易会把配置文件的Key拼错,或者Value的值与我们的变量类型并不兼容(实际上真的发生过这样的问题导致项目启动失败)。 但是在我们使用Spring Boot提供的配置的时候,IDE总是能为我们自动补全,告诉我们这个配置的变量类型,甚至是给我们把这个配置的描述显示出来。 ##### 我们是否也可以为我们自己写的配置添加这样的IDE支持呢? ![](//img1.jcloudcs.com/developer.jdcloud.com/317a7d53-c45b-4af4-a5ce-a929de1df78720210302103009.png) #### 配置项元数据(Configuration Metadata) Spring Boot的Jar文件包含元数据文件,这些文件提供了我们所需要的配置属性的详细信息。IDE通过读取这些元数据文件,然后在使用application.properties或application.yml的时候提供上下文信息和代码补全。**那么只要知道如何编写并存放配置项元数据信息文件,我们也可以让IDE知道如何为我们的自定义配置提供上下文信息。** ##### 元数据格式 Spring Boot项目的配置项元数据文件都放在META-INF/spring-configuration-metadata.json中。下图是当我们配置好Spring Boot项目后默认使用的Spring Boot自动配置的配置项元数据存放的位置 ![](//img1.jcloudcs.com/developer.jdcloud.com/395d10b7-4b38-4f5c-a284-38e7f2a2e12b20210302103050.png) 配置项元数据文件按照groups, properties和hints组织。properties下的每个property都是程序中需要使用的配置项的key值,比如server.port是服务启动后的端口号。而我们可以将一些property按照某些规则组合起来,这个组合就是group(通常我们并不需要为properties组织对应的group)。而hints是为我们的配置项提供额外的信息,比如时区time.zone支持Asia/Shanghai,我们可以为它提供"Asia/Shanghai"的hint。 ##### properties的参数 ![](//img1.jcloudcs.com/developer.jdcloud.com/60d75669-d863-4c47-9f71-b1d9b9fb427720210302103152.png) ##### hints的参数 ![](//img1.jcloudcs.com/developer.jdcloud.com/585854b7-b075-4d7f-81e4-b3ecd40861fb20210302103230.png) ##### ValueHint的参数 ![](//img1.jcloudcs.com/developer.jdcloud.com/81940f1d-ae77-44ee-8428-d64a6eb4912420210302103310.png) 这里只展示了我们常用的参数,关于配置项元数据文件格式的详细信息可以看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) ![](//img1.jcloudcs.com/developer.jdcloud.com/d8d9c378-220c-4bc8-b6bf-a38123406dd420210302103339.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/650b5f69-4339-4ca4-b16f-cddae832636c20210302103626.png) ##### 在IDE中实际使用的效果 ![](//img1.jcloudcs.com/developer.jdcloud.com/1cecd10c-2bee-4868-831a-8d167a5f07fa20210302103713.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/521d78d2-4f23-4626-85ed-18e1648b209520210302103724.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/a6e3d0e4-d326-44bf-9181-3844c3e426db20210302103732.png) 不过这种方式虽然好,但是需要我们写很多的JSON配置来告诉IDE该如何进行代码补全和附加上下文信息,配置和代码还是处于分离的状态,**如果能通过写一个配置类,直接通过这个类和它的注释**就能为我们做到IDE支持就好了——Spring Boot开发者也是这么想的。 #### 为代码自动生成配置项元数据 首先我们要改掉随处使用@Value的习惯,使用专门的数据类来存放我们的配置项 ![](//img1.jcloudcs.com/developer.jdcloud.com/54fa3f2d-eab1-4154-bbb1-c794d90b388620210302103906.png) 接下来我们创建一个Bean,让Spring Boot容器来接管这个类的实例 ![](//img1.jcloudcs.com/developer.jdcloud.com/95897eee-3469-4196-b5f2-6d53cfb60e9f20210302103931.png) 通过@ConfigurationProperties注解,Spring就会自动将配置注入到我们的配置Bean中,但是此时IDE还无法识别我们添加的自动配置,我们需要添加Spring Boot的注解处理器(annotation processor,从Java 1.6开始支持的特性) ![](//img1.jcloudcs.com/developer.jdcloud.com/de4a09ec-f488-4a24-9c3a-76d79d864eda20210302103958.png) 添加注解处理器后重新编译,我们就会在target目录下看到自动生成的META-INF/spring-configuration-metadata.json ![](//img1.jcloudcs.com/developer.jdcloud.com/5f422851-d4d4-4ccd-872d-cc75aefc082e20210302104022.png) 里面的内容基本就是我们之前自己手动输入的内容,只是受于Java代码表达信息的局限性,没有办法生成hints信息。其中sourceType和sourceMethod属性还可以帮助IDE跳转到我们声明这个配置的类和方法 ![](//img1.jcloudcs.com/developer.jdcloud.com/03f26670-6162-4d91-8c75-03f1ed92884220210302104049.png) 如果我们想要让我们使用代码生成的配置类也能添加提示的话,可以在我们的META-INF目录下添加additional-spring-configuration-metadata.json文件,将hints写到这个文件里面 ![](//img1.jcloudcs.com/developer.jdcloud.com/c61fb66f-5c8a-41db-9b72-4800f994339820210302104110.png) 这样Spring Boot在编译的时候就会将我们的提示信息合并到配置信息元数据文件里面了 ![](//img1.jcloudcs.com/developer.jdcloud.com/f55462eb-a473-415f-bdf6-d317a824c6d120210302104135.png) #### 总结 虽然这些工作不会增加代码的运行效率,但是可以让我们的配置内容集中起来,通过配置可以找到对应的代码,通过代码也可以反过来找到对应的配置。可以让我们更改配置的时候更加有信心,当我们为项目添加新的环境时不必粗暴的复制粘贴知其然而不知其所以然。 ##### 正如开头所说的,代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已。 ------------ ###### 自猿其说Tech-JDL京东物流技术发展部 ###### 作者:中台技术部 纪卓志
原创文章,需联系作者,授权转载
上一篇:通过linux-PAM实现禁止root用户登陆的方法
下一篇:流量洪峰磨练,京东云造“京刚”!
相关文章
Taro小程序跨端开发入门实战
Flutter For Web实践
配运基础数据缓存瘦身实践
自猿其说Tech
文章数
426
阅读量
2150186
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
最新回复
丨
点赞排行
共0条评论
自猿其说Tech
文章数
426
阅读量
2150186
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号