yaml转properties_yaml追加配置
springboot加载properties和yml配置文件的顺序
然后扩展一下 BindConfig设一个项目在同一位置同时存在application.本文主要参考ExternalizedConfiguration为了能让应用在不同的环境下运行,SpringBoot允许自定义配置文件,如properties文件、yaml文件、系统环境变量参数、命令行参数。properties和application.yml文件,注意查看上面的 age,因为传入的参数非法,所以是 null
且其中都含有相同的某个key,但value不同,如:
application.properties中:server.port=8001,
application.yml中:server.port=8888。
问题:springboot是否都加载这两个配置文件?如果两个文件有相同的key,取哪一个文件的value?
答: 都加载,且按properties→yml的顺序加载。
在看到spring.factories中,配置加载器顺序是先执行PropertiesPropertySourceLoader再到YamlPropertySourceLoader。
在ConfigFileApplicationListener获取server.port这个key的value时候,可以发现两配置文件全都加载进去了,且注意顺序,application.properties文件在前。
getSource()方法获取到两个Source,先从application.properties文件中查找值,一旦找到立即返回,如果找不到再从application.yml中查找。
YAML文件与properties文件比较
如针对前面的 BindConfig ,没有 notExist 这个属性,但是配置文件中,却加上了这个可以明显的看到,在处理层级关系的时候,properties需要使用大量的路径来描述层级(或者属性),比如environments.dev.和environments.dev.name。其次,对于较为复杂的结构,比如数组(my.servers),写起来更为复杂。而对应的YAML格式文件就简单很多:application1.yml
可以直观的看到,YAML使用冒号加缩进的方式代表层级(属性)关系,使用短横杠(-)代表数组元素。首先,在SpringBoot中,有两种配置文件的方式。一种是application.properties,另一种application.yaml(或者是application.yml)。
经过这个示例的演示,可以很明显的看到YAML针对properties文件的优异之处。
yml文件常见的几种读取方式
YAML文件除了默认的properties文件,SpringBoot还提供另外一种配置文件yml,这种文件提供一种更加简洁的方式编写配置信息。最常见的两种再次执行输出如
接下来要讲的几种case要用到如下的yml文件
application.yml
借助Spring提供的一个类,org.springframework.core.env.Environment, 它继承了PropertyResolver, 所以可以当作属性解析器使用
Spring提供了YamlPropertiesFactoryBean可以读取自定义配置yml文件,不再拘泥于application.yml及其激活的其他配置文件
存在问题: 那就是只有在这个接口的请求中能够取到这个属性的值,如果再写一个接口,不使用YamlPropertiesFactoryBean读取配置文件,即使之前的方法已经读取过这个yml文件一次了,第二个接口取到的仍然还是空值。
解决方式: 配合PropertySourcesPlaceholderConfigurer使用,它实现了BeanFactoryPostProcessor接口,也就是一个bean工厂后置处理器的实现,可以将配置文件的属性值加载到一个Properties文件中。使用方法如下:
除了使用YamlPropertiesFactoryBean将yml解析成Properties外,其实我们还可以使用YamlMapFactoryBean解析yml成为Map
使用snakeYml,需要引入依赖
使用方式:
使用jackson,需要引入依赖先来看一个Springboot中的properties文件和对应YAML文件的对比:
使用jackson读取yml也非常简单,这里用到了常用的ObjectMapper,在创建ObjectMapper对象时指定使用YAML工厂,之后就可以简单的将yml映射到实体:
SpringBoot中yaml文件配置属性
配置的自动提示支持也比较简单,添加 org.springframework.boot:spring-boot-configuration-processor 依赖,打包之后在 META-INF 中会多一个 json 文件 spring-configuration-metadata.jsonyaml文件格式是SpringBoot支持的一种JSON超集文件格式,相对于传统的Properties配置文件,yaml文件以数据为核心,是一种更为直观且容易被计算机识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只是yaml格式配置文件看起来要跟简洁一些。
application.yaml文件使用 key:(空格) value 格式配置属性,使用缩进控制层关系
注意:此时por常见的配置除了基本类型之外,能嵌套自定义对象么,非基本类型又可以如何解析呢?t和path属性,属于同一层级
另一种为:
上述两种缩进式写法为person对象的hobby属性赋值,其中一种是通过“-(空格)属性值”的形式为属性赋值,另一种是直接赋值使用英文逗号分隔属性值。
行内式的写法显然比缩进式写法更加简洁。使用行内式写法设置属性值时,中括号“[ ]”是可以省略的,程序会自动匹配校对属性的值
在yaml配置的属性值为Map或对象类型时,缩进式的形式按照yaml文件格然后自动补全就有了式编写即可,而行内式写法的属性值要用大括号“{ }”包含
【基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情
这个时候如想实现上面的配置解析,可以通过实现 org.springframework.core.convert.converter.Converter 接口来支持,并通过 @ConfigurationPropertiesBinding 注解来表明这是个配置属性转换类,不加这个注解会不生效哦本项目借助 SpringBoot 2.2.1.RELEASE + men 3.5.3 + IDEA 进行开发其中缩进式写法有两种表示形式,一种为:
下面是核心的 pom.xml (源码可以再文末获取)关于上面一点,也就表明我们可以在自动 AutoConfiguration 类中,声明一个内部类来绑定配置信息,如下
定我们现在自定义一个功能模块,里面有一些我们自定义的参数,支持通过 yaml 配置文件的方式注入
首先我们可以先定义一个配置类 BindConfig
请注意上面的注解中, prefix = hhui.bind ,简单来讲就是会读取配置文件中,前缀为 hhui.bind 的属性,然后依次赋值到这个类中
对应的配置文件如下
注意事项
我们通过 @ConfigurationProperties 修饰配置类之后,是否直接会生效呢?通常来讲,让它生效有下面三种方式
直接在配置类上添加 @Component , @Configuration 等注解,让 Spring 容器扫描并加载它
使用这种方式时,需要注意配置类在自动扫描的包路径下,否则可能不会被扫描(主要是作为第三方 jar 包提供服务时,可能出现扫描不到的问题)
把它当成一个普通的 bean,借助 bean 注册的方式来实现,也是一个可选的方案,一般的实现方式如下
在配置类上,添加这个注解之后,可以实现配置注册,一般常见的使用姿势如
上面三种注册方式,前面两种的思路是将配置类作为 bean,第三种实现思路和主动注册 bean 一致(所以想实现主动注册 bean,可以考虑它的实现逻辑)
如果我们在配置中,一个本来希望接收 int 类型的参数,结果实际上填了一个非整形,会怎样?
比如前面的配置类,我们实际的配置文件将 age 填 18y,来看一下最终会发生什么事情
简单演示,直接在启动类中测试一下会如何
参数异常之后,直接启动失败,如果对参数的要求没有那么严格,即允许失败,我们可以通过设置 ignoreInvalidFields = true
再次执行之后,会发现正常启动,输出如下
说明
结合默认值 + ignoreInvalidFields 方式来支持配置的可用性:
我们新定义一个 Pwd 类
这个时候 mainPwd 对应的 yaml 配置文件可以如下设置
从上面的介绍也可以看出,对于自定义的 POJO 类是支持的,使用姿势也没什么区别
此外,对于 List 和 Map 的使用也给出了实例
上面我们自定义的 Pwd 类,主要借助 setter 方法,将匹配的属性塞入进去;如果我的配置就是一个 json 串,可以注入到一个 POJO 类么
对应的 Jwt 类如下
说明
使用自定义的配置解析规则时,注意两点
Spring 提供了一些默认的配置解析规则,如
一个配置类,对应的类中没有这个属性会怎样?
实测之后,发现没有任何影响,通过查看 @ConfigurationProperties 注解的成员,发现可以设置 ignoreUnknownFields=false ,从字面上表示出现了未能识别的成员,不会略错误,但是在实际测试中,并没有生效
添加 pom 依赖
然后再配置类上添加 @Validated ,然后就可以在需要校验的字段上添加对应的限制
如果我们将 age 参数设置不满足上面的条件
平时在 Spring 开发过程中,在 yaml 文件中添加配置时,配合 idea 有非常友好的提示,可以非常友好的补全参数配置
那么我们自定义的参数想实现这个效果应该怎么做呢?
添加文章最开头的依赖
添加上面的依赖之后,打包 mvn clean package ,然后会发现在 META-INF 下面有个 spring-configuration-metadata.json
说明
本文介绍了 @ConfigurationProperties 修饰 POJO 类,实现配置的绑定,可以通过将这个类声明为一个普通 bean 的方式进行注册,也可以借助 @EnableConfigurationProperties 来注册
在配置参数时,需要注意如果参数类型不一致,会导致项目启动失败;可以通过设置 ConfigurationProperties#ignoreInvalidFields = true ,来避免这种场景
通过实现接口 Converter + @ConfigurationPropertiesBinding 来自定义参数解析转换规则,可以实现各路姿势的参数解析
项目源码
系列博文
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
SpringBoot中yaml文件配置属性
YAML的配置文件后缀为.yml,例如Springboot项目中使用到的配置文件appli参数校验可以说比较常用的 case 了,比如前面的配置 age ,基本上不会允许这个参数能是负数,如需要对参数进行校验,我们可以借助 @Validated 来实现校验cation.ymljackson还可以生成yml文件。
SpringBoot中的配置文件主要有三种格式,properties、yaml、和xml方式。
对SpringBoot来说,虽然application.yml配置文件更加常见,但是其实默认配置文件是application.properties,当然其格式可以是properties也可以是yaml格式;除此之外,其配置文件在 SpringBoot 项目中,获取配置属性可以说是一个非常简单的事情,将配置写在 aplication.yml 文件之后,我们就可以直接通过 @Value 注解来绑定并获取;此外我们也可以将一个结构化的配置,借助 @ConfigurationPorperties 绑定到一个 POJO,然后供项目使用,那么在使用它的时候,不知是否有想过也可以是bootstrap.yml。
springboot配置文件格式
再次测试会发现报如下错误Spring Boot支持两种主要的配置文件格式,它们分别是properties格式和YAML格式。idea 添加插件 Spring Assistant ,支持非常友好的配置注入
1. properties格式:这是一个传统的键值对格式,它使用“.”来分组配置信息。例如,我们可以像这样设置的端口:server.port=8080。这种格式的优点在于它的简洁性和易读性,对于初学者来说很容易理解。同时,它也是Spring Boot默认的配置文件格式,因此在没有特殊需求的情况下,使用properties格式是个不错的选择。
2. YAML格式:YAML是一种数据序列化格式,它使用缩进(而不是像properties那样使用“.”)来分组配置信息。这使得YAML文件在视觉上更易于理解,因为它更接近于自然的层次结构。例如,同样的端口设置,在YAML格式中是这样表示的:server: port: 8080。YAML的另一个优点如果上面这些都已经了然于心,那么本文的帮助将不会特别大;如果对此有所疑问,接下来将逐一进行解惑是它的语法更强大,可以支持更复杂的数据结构,包括列表和嵌套字典。
在实际使用中,选择哪种配置文件格式主要取决于你的个人或团队的喜好。如果你更倾向于简洁明了、易于上手的配置方式,那么properties格式可能是个好选择。如果你需要处理更复杂的配置数据,或者希望配置文件更直观、易读,那么YAML格式可能更适合你。值得注意的是,Spring Boot允许在同一个项目中同时使用这两种格式,你可以根据需要灵活选择。
无论你选择哪种配置文件格式,都需要记住一点:配置文件是Spring Boot项目的重要组成部分,它决定了你的应用如何运行。因此,你需要确保你理解你所选择的配置文件格式的语法和规则,以避免可能的错误和混淆。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。