搞 Spring Boot 的小伙伴都知道, Spring Boot 中的配置文件有两种格式, properties 或者 YAML, 一般情况下, 两者可以随意使用, 选择自己顺手的就行了, 那么这两者完全一样吗? 肯定不是啦! 本文就来和大伙重点介绍下 YAML 配置, 最后再来看看 YAML 和 properties 配置有何区别.
狡兔三窟
首先 application.YAML 在 Spring Boot 中可以写在四个不同的位置, 分别是如下位置:
项目根目录下的 config 目录中
项目根目录下
classpath 下的 config 目录中
classpath 目录下
四个位置中的 application.YAML 文件的优先级按照上面列出的顺序依次降低. 即如果有同一个属性在四个文件中都出现了, 以优先级高的为准.
那么 application.YAML 是不是必须叫 application.YAML 这个名字呢? 当然不是必须的. 开发者可以自己定义 YAML 名字, 自己定义的话, 需要在项目启动时指定配置文件的名字, 像下面这样:
当然这是在 IntelliJ IDEA 中直接配置的, 如果项目已经打成 jar 包了, 则在项目启动时加入如下参数:
java -jar myproject.jar --spring.config.name=App
这样配置之后, 在项目启动时, 就会按照上面所说的四个位置按顺序去查找一个名为 App.YAML 的文件. 当然这四个位置也不是一成不变的, 也可以自己定义, 有两种方式, 一个是使用 spring.config.location 属性, 另一个则是使用 spring.config.additional-location 这个属性, 在第一个属性中, 表示自己重新定义配置文件的位置, 项目启动时就按照定义的位置去查找配置文件, 这种定义方式会覆盖掉默认的四个位置, 也可以使用第二种方式, 第二种方式则表示在四个位置的基础上, 再添加几个位置, 新添加的位置的优先级大于原本的位置.
配置方式如下:
这里要注意, 配置文件位置时, 值一定要以 / 结尾.
数组注入
YAML 也支持数组注入, 例如
- my:
- servers:
- - dev.example.com
- - another.example.com
这段数据可以绑定到一个带 Bean 的数组中:
- @ConfigurationProperties(prefix="my")
- @Component
- public class Config {
- private List<String> servers = new ArrayList<String>();
- public List<String> getServers() {
- return this.servers;
- }
- }
项目启动后, 配置中的数组会自动存储到 servers 集合中. 当然, YAML 不仅可以存储这种简单数据, 也可以在集合中存储对象. 例如下面这种:
- Redis:
- redisConfigs:
- - host: 192.168.66.128
- port: 6379
- - host: 192.168.66.129
- port: 6380
这个可以被注入到如下类中:
- @Component
- @ConfigurationProperties(prefix = "redis")
- public class RedisCluster {
- private List<SingleRedisConfig> redisConfigs;
- // 省略 getter/setter
- }
优缺点
不同于 properties 文件的无序, YAML 配置是有序的, 这一点在有些配置中是非常有用的, 例如在 Spring Cloud Zuul 的配置中, 当我们配置代理规则时, 顺序就显得尤为重要了. 当然 YAML 配置也不是万能的, 例如, YAML 配置目前不支持 @PropertySource 注解.
关注公众号 [江南一点雨] , 专注于 Spring Boot + 微服务以及前后端分离等全栈技术, 定期视频教程分享, 关注后回复 Java , 领取松哥为你精心准备的 Java 干货!
来源: https://www.cnblogs.com/lenve/p/11525686.html