加载中…
个人资料
杨济忠
杨济忠
  • 博客等级:
  • 博客积分:0
  • 博客访问:346,830
  • 关注人气:36
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

springbootYAML配置及与properties文件对比优缺点

(2019-06-17 07:15:33)
标签:

it

java

我专门给大家翻译外文IT参考资料,想学的,可以关注,也可以关注我个人自己建的博客:http://www.1024sky.cn

yaml是JSON的超集,因此,它是指定层次结构配置数据的格式。每当类路径上有SnakeYAML 库时,SpringApplication类自动支持yaml作为属性的替代。

如果使用spring-boot-starter,则会自动提供snakeyaml。

2.7.1. 加载YAML
Spring框架提供了两个方便的类,可以用来加载yaml文档。YamlPropertiesFactoryBean 将yaml作为Properties 加载 YamlMapFactoryBean将yaml作为Map加载。

例如,考虑以下yaml文档:


environments:
    dev:
        url: http://dev.example.com
        name: Developer Setup
    prod:
        url: http://another.example.com
        name: My Cool App

前面的示例将转换为以下属性:


environments.dev.url=http://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=http://another.example.com
environments.prod.name=My Cool App

yaml列表用[index]表示为属性键。例如,考虑以下yaml:


my:
   servers:
       - dev.example.com
       - another.example.com

前面的示例将转换为这些属性:


my.servers[0]=dev.example.com
my.servers[1]=another.example.com

要使用Spring Boot的Binder 实用程序(这就是@ConfigurationProperties 所做的)绑定到这样的属性,您需要在java.util.List (或Set)类型的目标bean中有一个属性,并且您需要提供一个setter或用一个可变的值初始化它。例如,以下示例绑定到前面显示的属性:


@ConfigurationProperties(prefix="my")
public class Config {

    private List servers = new ArrayList();

    public List getServers() {
        return this.servers;
    }
}


2.7.2. 在Spring中把YAML显示为Properties
YamlPropertySourceLoader类可用于在Spring环境中公开yaml作为PropertySource。这样可以使用带有占位符语法的@Value注释来访问yaml属性。

2.7.3. 多种特定YAML文档
可以在单个文件中指定多个特定yaml文档,并通过使用spring.profiles键指示文档何时应用,如下例所示:

server:
    address: 192.168.1.100
---
spring:
    profiles: development
server:
    address: 127.0.0.1
---
spring:
    profiles: production & eu-central
server:
    address: 192.168.1.120

在前面的示例中,如果开发文件处于活动状态,则server.address属性为127.0.0.1。同样,如果生产配置文件和UAT配置文件处于活动状态,则server.address属性为192.168.1.120。如果未启用开发、生产和uat配置文件,则属性值为192.168.1.100。

因此,spring.profiles可以包含一个简单的特定文件名(例如production)或特定文件表达式。配置文件表达式允许表达更复杂的配置文件逻辑,例如 production & (eu-central | eu-west)。有关详细信息,请参阅参考指南。

如果在应用程序上下文启动时没有显式激活,则会激活默认配置文件。因此,在下面的yaml中,我们为 spring.security.user.password设置了一个值,该值仅在“default”配置文件中可用:


server:
  port: 8000
---
spring:
  profiles: default
  security:
    user:
      password: weak

但是,在下面的示例中,总是设置密码,因为它没有附加到任何配置文件,并且必须根据需要在所有其他配置文件中显式重置密码:


server:
  port: 8000
spring:
  security:
    user:
      password: weak

使用spring.profiles元素指定的Spring配置文件可以通过使用否定!符号。如果为单个文档同时指定了否定配置文件和非否定配置文件,则必须至少匹配一个非否定配置文件,并且不能匹配任何否定配置文件。

2.7.4. YAML 缺点
无法使用@PropertySource 注释加载yaml文件。因此,在需要以这种方式加载值的情况下,需要使用properties文件。

在特定的yaml文件中使用多种yaml文档语法可能会导致意外行为。例如,在一个名为application-dev.yml的文件中考虑以下配置,其中 dev配置文件处于活动状态:


server:
  port: 8000
---
spring:
  profiles: !test
  security:
    user:
      password: weak

在上面的示例中,配置文件否定表达和配置文件表达式的行为将不符合预期。我们建议您不要将特定的yaml文件和多个yaml文件结合起来,只使用其中一个。
2.7.5 YAML 与properties对比
springboot大多是使用.yml文件配置的。将yml与properties对比之后发现,yml最大的好处在于其拥有天然的树状结构,所以着手尝试将properties文件更改为yml文件,发现了几个要注意的地方:
1、在properties文件中是以”.”进行分割的, 在yml中是用”:”进行分割;
2、yml的数据格式和json的格式很像,都是K-V格式,并且通过”:”进行赋值;
3、在yml中缩进一定不能使用TAB,否则会报很奇怪的错误;(缩进特么只能用空格!!!!)
4、每个k的冒号后面一定都要加一个空格;
5、使用spring cloud的maven进行构造的项目,在把properties换成yml后,一定要进行mvn clean insatll

 

我最近翻译了Springboot的官方英文文档,大家可以去看看其它内容:

1、官方入门文档

http://www.itmanclub.com/blog/article/39

2、官方spring-boot-features文档

2.1、Spring应用程序 http://www.itmanclub.com/blog/article/16
2.2、读取外部配置 http://www.itmanclub.com/blog/article/17
2.3、多环境配置 http://www.itmanclub.com/blog/article/18
2.4、日志配置 http://www.itmanclub.com/blog/article/19
2.5、国际化及JSON http://www.itmanclub.com/blog/article/20
2.6、开发Web应用程序
第一部分 http://www.itmanclub.com/blog/article/21
第二部分 http://www.itmanclub.com/blog/article/22
2.7、安全性 http://www.itmanclub.com/blog/article/24
2.8、使用SQL数据库 http://www.itmanclub.com/blog/article/25
2.9、与NoSQL技术关联 http://www.itmanclub.com/blog/article/26
2.10、Caching缓存 http://www.itmanclub.com/blog/article/27
2.11、消息队列 http://www.itmanclub.com/blog/index/28
2.12、调用REST服务的两种方法 http://www.itmanclub.com/blog/article/29
2.13、验证 http://www.itmanclub.com/blog/article/30#validation
2.14、邮件、http://www.itmanclub.com/blog/article/30#mail
2.15、分布式事务 http://www.itmanclub.com/blog/article/30#jta
2.16、Hazelcast http://www.itmanclub.com/blog/article/32#hazelcast
2.17、Quartz http://www.itmanclub.com/blog/article/32#quartz
2.18、任务执行和调度 http://www.itmanclub.com/blog/article/32#scheduling
2.19、Spring集成http://www.itmanclub.com/blog/article/33#integration
2.20、Spring会话 http://www.itmanclub.com/blog/article/33#session
2.21、JMX监控和管理http://www.itmanclub.com/blog/article/33#jmx
2.22、Springboot测试
第一部分 http://www.itmanclub.com/blog/article/34
第二部分http://www.itmanclub.com/blog/article/35
2.23、WebSocket http://www.itmanclub.com/blog/article/36#websockets
2.24、Web Services http://www.itmanclub.com/blog/article/36#webservices
2.25、创建你自己的自动配置http://www.itmanclub.com/blog/article/37
2.26、 Kotlin支持 http://www.itmanclub.com/blog/article/38

3.官方howto文档

3.1、Spring Boot 应用程序 http://www.itmanclub.com/blog/article/4
3.2、属性和配置 http://www.itmanclub.com/blog/article/5
3.3、嵌入式Web服务器 http://www.itmanclub.com/blog/article/6
3.4、SpringMVC http://www.itmanclub.com/blog/article/7
3.5、Security http://www.itmanclub.com/blog/article/8#security
3.6、Jersey http://www.itmanclub.com/blog/article/8#jersey
3.7、HTTP客户端 http://www.itmanclub.com/blog/article/8#http
3.8、日志 http://www.itmanclub.com/blog/article/9
3.1、数据库访问相关http://www.itmanclub.com/blog/article/10
3.9、数据库初始化 http://www.itmanclub.com/blog/article/11
3.10、 消息 http://www.itmanclub.com/blog/article/12#message
3.10、批处理 http://www.itmanclub.com/blog/article/12#batch
3.12、Actuator http://www.itmanclub.com/blog/article/12#actuator
3.13、安全 http://www.itmanclub.com/blog/article/13#secure
3.14、 热部署 http://www.itmanclub.com/blog/article/13#hotswapping
3.15、构建 http://www.itmanclub.com/blog/article/14
3.16、传统部署方法 http://www.itmanclub.com/blog/article/15


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有