【基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情

【基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情,第1张

在 SpringBoot 项目中,获取配置属性可以说是一个非常简单的事情,将配置写在 aplicationyml 文件之后,我们就可以直接通过 @Value 注解来绑定并获取;此外我们也可以将一个结构化的配置,借助 @ConfigurationPorperties 绑定到一个 POJO,然后供项目使用,那么在使用它的时候,不知是否有想过

如果上面这些都已经了然于心,那么本文的帮助将不会特别大;如果对此有所疑问,接下来将逐一进行解惑

本项目借助 SpringBoot 221RELEASE + maven 353 + IDEA 进行开发

下面是核心的 pomxml (源码可以再文末获取)

假定我们现在自定义一个功能模块,里面有一些我们自定义的参数,支持通过 yaml 配置文件的方式注入

首先我们可以先定义一个配置类 BindConfig

请注意上面的注解中, prefix = hhuibind ,简单来讲就是会读取配置文件中,前缀为 hhuibind 的属性,然后依次赋值到这个类中

对应的配置文件如下

注意事项

关于上面最后一点,也就表明我们可以在自动 AutoConfiguration 类中,声明一个内部类来绑定配置信息,如下

我们通过 @ConfigurationProperties 修饰配置类之后,是否直接会生效呢?通常来讲,让它生效有下面三种方式

直接在配置类上添加 @Component , @Configuration 等注解,让 Spring 容器扫描并加载它

使用这种方式时,需要注意配置类在自动扫描的包路径下,否则可能不会被扫描(主要是作为第三方 jar 包提供服务时,可能出现扫描不到的问题)

把它当成一个普通的 bean,借助 bean 注册的方式来实现,也是一个可选的方案,一般的实现方式如下

在配置类上,添加这个注解之后,可以实现配置注册,一般常见的使用姿势如

上面三种注册方式,前面两种的思路是将配置类作为 bean,第三种实现思路和主动注册 bean 一致(所以想实现主动注册 bean,可以考虑它的实现逻辑)

如果我们在配置中,一个本来希望接收 int 类型的参数,结果实际上填了一个非整形,会怎样?

比如前面的配置类,我们实际的配置文件将 age 填 18y,来看一下最终会发生什么事情

简单演示,直接在启动类中测试一下会如何

参数异常之后,直接启动失败,如果对参数的要求没有那么严格,即允许失败,我们可以通过设置 ignoreInvalidFields = true

再次执行之后,会发现正常启动,输出如下

注意查看上面的 age,因为传入的参数非法,所以是 null

说明

结合默认值 + ignoreInvalidFields 方式来支持配置的最大可用性:

再次执行输出如

常见的配置除了基本类型之外,能嵌套自定义对象么,非基本类型又可以如何解析呢?

我们新定义一个 Pwd 类

然后扩展一下 BindConfig

这个时候 mainPwd 对应的 yaml 配置文件可以如下设置

从上面的介绍也可以看出,对于自定义的 POJO 类是支持的,使用姿势也没什么区别

此外,对于 List 和 Map 的使用也给出了实例

上面我们自定义的 Pwd 类,主要借助 setter 方法,将匹配的属性塞入进去;如果我的配置就是一个 json 串,可以注入到一个 POJO 类么

对应的 Jwt 类如下

这个时候如想实现上面的配置解析,可以通过实现 orgspringframeworkcoreconvertconverterConverter 接口来支持,并通过 @ConfigurationPropertiesBinding 注解来表明这是个配置属性转换类,不加这个注解会不生效哦

说明

使用自定义的配置解析规则时,注意两点

Spring 提供了一些默认的配置解析规则,如

一个配置类,对应的类中没有这个属性会怎样?

如针对前面的 BindConfig ,没有 notExist 这个属性,但是配置文件中,却加上了这个

实测之后,发现没有任何影响,通过查看 @ConfigurationProperties 注解的成员,发现可以设置 ignoreUnknownFields=false ,从字面上表示出现了未能识别的成员,不会略错误,但是在实际测试中,并没有生效

参数校验可以说比较常用的 case 了,比如前面的配置 age ,基本上不会允许这个参数能是负数,如需要对参数进行校验,我们可以借助 @Validated 来实现校验

添加 pom 依赖

然后再配置类上添加 @Validated ,然后就可以在需要校验的字段上添加对应的限制

如果我们将 age 参数设置不满足上面的条件

再次测试会发现报如下错误

平时在 Spring 开发过程中,在 yaml 文件中添加配置时,配合 idea 有非常友好的提示,可以非常友好的补全参数配置

那么我们自定义的参数想实现这个效果应该怎么做呢?

添加文章最开头的依赖

添加上面的依赖之后,打包 mvn clean package ,然后会发现在 META-INF 下面有个 spring-configuration-metadatajson

然后自动补全就有了

说明

idea 推荐添加插件 Spring Assistant ,支持非常友好的配置注入

本文介绍了 @ConfigurationProperties 修饰 POJO 类,实现配置的绑定,可以通过将这个类声明为一个普通 bean 的方式进行注册,也可以借助 @EnableConfigurationProperties 来注册

在配置参数时,需要注意如果参数类型不一致,会导致项目启动失败;可以通过设置 ConfigurationProperties#ignoreInvalidFields = true ,来避免这种场景

通过实现接口 Converter + @ConfigurationPropertiesBinding 来自定义参数解析转换规则,可以实现各路姿势的参数解析

配置的自动提示支持也比较简单,添加 orgspringframeworkboot:spring-boot-configuration-processor 依赖,打包之后在 META-INF 中会多一个 json 文件 spring-configuration-metadatajson

项目源码

系列博文

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

JSP是一门基于JAVA语言的一种web应用开发技术,由JSP制作的动态网站具有非常好的跨平台性;所以对于做web开发的程序员来说,精到的掌握JSP的使用是极其重要的;在网络通信中,最常见的模式是B/S通信模式,即用户把需要获取的信息用浏览器向某个服务器发出请求,服务器使用web服务软件将用户的请求信息处理后发送给用户;所以使用jsp技术发送的请求就需要服务器端有相应的jsp引擎(即web服务软件)进行处理,jsp引擎有很多,下面使用有sun公司开发的开源的tomcat服务器来进行讲述;所以下面从tomcat服务器的安装开始讲起分为:一、tomcat的安装与配置;二、测试jsp页面;三、设置web服务目录三个方面来进行说明。

一:tomcat的安装与配置

这里默认jdk已经安装成功且环境变量已经设置为如下值:变量名Java_Home=E:\jdk180_45变量名Classpath=E:\jdk180_45\jre\lib\rtjar;,;变量名Path=E:\JDK180_45\BIN

安装tomcat有两种方式(一)apache-tomcat-6013zip文件的安装;(二)apache-tomcat-6013exe文件的安装下面只介绍第一种方式;

将apache-tomcat-6013zip文件解压到磁盘的某个分区下,如解压到E:\,将出现下面的目录结构

接下来双击bin目录下的startupbat文件,将会出现如下MS-DOS窗口表明已经启动了tomcat服务器,若不关闭该窗口该服务器将一直工作下去;

若双击后没有出现该界面或者只是闪烁了一下,一般是环境变量没有设置好;然后在浏览器的地址栏里输入>

一种可能是你的yml文件没有被ide标注为资源文件,这种的症状就是你的yml文件是个表格状的图标,这时,你只需在你的yml所在的文件夹上(一般是resources文件夹)右键,选择“标记目录为”-》resources root即可,这时你的yml文件就会变成一个绿叶的图标,大功告成!!!

yml文件配置如下:

${key:default_value} 这种表达方式是通过key来获取value,如果获取不到就使用后面默认值。

使用场景:

一些直接通过Jar包启动时,可以在启动时手动配置相关参数,如果没有配置,也会自动获取默认值进行启动,如

当然,${}这种形式本来也可以用来获取值,比如在本yml文件中去获取其他位置定义好的值,也可以去获取相关的环境变量。

以上就是关于【基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情全部的内容,包括:【基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情、jsp的环境配置与简单jsp页面测试、springboot 为什么读取不到 yml 属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9637797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存