微服务开发的入门级框架 Spring Boot 详解(二)

2017 年 8 月 13 日 开源中国 二十岁以后

点击图片报名参加广州&珠海源创会


Spring Boot的属性配置文件


1.1

Spring Boot的属性配置文件的第一种形式

使用properties配置文件,如下两个属性的含义是更改访问端口为8081,并且加了一个contextPath,可以理解为在地址栏多加层地址。

右键点击DemoApplication.java ——》Run As ——》Spring Boot App启动程序

效果如下,首先从日志上看,端口已经变为8081

            浏览器访问效果如下。

    

补充:

属性文件是最常见的管理配置属性的方式。Spring Boot 提供的 SpringApplication 类会搜索并加载 application.properties 文件来获取配置属性值。SpringApplication 类会在下面位置搜索该文件:

  1. 当前目录的/config子目录

  2. 当前目录

  3. classpath 中的/config包

  4. classpath

上面的顺序也表示了该位置上包含的属性文件的优先级。优先级按照从高到低的顺序排列。

可以通过spring.config.name这个key的配置属性来指定不同的属性文件名称。也可以通过spring.config.location来添加额外的属性文件的搜索路径。


1.2

Spring Boot的属性配置文件的第二种形式

使用yml方式配置,在resources目录下建立application.yml文件。代码如下。

效果与1.1相同。

补充:                   

相对于属性文件来说,YAML 是一个更好的配置文件格式。当有前缀的情况下,使用.yml格式的配置文件更简单。

注意:使用.yml时,属性名的值和冒号中间必须有空格,如name: SpringBoot正确,SpringBoot就是错的。

YAML 在 Ruby on Rails 中得到了很好的应用。YAML是JSON的一个超集,也是一种方便的定义层次配置数据的格式。它的基本语法规则如下:

  • 大小写敏感

  • 使用缩进表示层级关系

  • 缩进时不允许使用Tab键,只允许使用空格。

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。


1.3

application.properties里哪些 key 可配置

在SpringBoot官网文档给出了详尽的配置以及说明。在Appendix A. Common application properties中:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties

不完全统计,这个完整的application properties文件,有1183行。其中,属性key有950个。当你看到如此庞大的配置,你一定会被吓到。不过,在实际项目中,我们如果遵循Spring Boot的约定,通常不需要我们单独指定太多配置。


1.4

关于配置的优先级

Spring Boot提供了一种优先级配置读取的机制来帮助我们从这种困境中走出来。

Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表(从高到低)如下所示。

  1. 命令行参数(优先级最高)。

  2. 通过 System.getProperties() 获取的 Java 系统参数。

  3. 操作系统环境变量。

  4. 从 java:comp/env 得到的 JNDI 属性。

  5. 通过 RandomValuePropertySource 生成的random.*属性。

  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件,通过spring.config.location参数指定

  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件

  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

  10. 应用 Java配置类,包含@Configuration注解的 Java 类,通过@PropertySource注解声明的属性文件。

  11. 通过SpringApplication.setDefaultProperties声明的默认属性。

如果Spring Boot在优先级更高的位置找到了配置,那么它就会忽略优先级低的配置。下面我们简单讲讲这些优先级。Spring Boot 的这个配置优先级看似复杂,其实是很合理的。命令行参数的优先级之所以被设置为最高,是因为可以方便我们在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。

SpringApplication 类默认会把以“--”开头的命令行参数转化成应用中可以使用的配置参数,如 “--name=Alex” 会设置配置参数 “name” 的值为 “Alex”。

如果不需要这个功能,可以通过SpringApplication.setAddCommandLineProperties(false)

禁用解析命令行参数。


Spring Boot自定义属性


2.1

第一个自定义属性的例子  

在实际开发过程中,需要程序去配置文件中读取数据(如:URL,一些账号密码等),所以就需要我们来自定义属性,供程序读取。

首先在yml里自定一个属性,格式如下:

 在Java程序中取值,代码如下:

使用浏览器访问效果如下


2.2

在自定义属性中调用其他属性

yml文件中的配置               


在JAVA程序中注入All属性

 效果如图所示:


2.3

对于多个属性如何一次调用

看了上面的例子后,会产生一个疑问,如果想一次调用10个、20个、50个属性值,难道我要在程序中注入50次值,使用50次注解吗? 为了解决这个疑问,Spring Boot 是这么解决的!

首先一个女孩,有身高、体重、罩杯等等属性,我们可以这样来写!

然后写一个类,这个类中提供Girl的属性,及Setter,Geter方法,需要使用两个注解:

  • @Component //如果没有这个注解,会报找不到Bean的错

  • @ConfigurationProperties(prefix="Girl") //找到以Girl开头的属性

 

然后在java程序中注入Gril类

 启动程序,刷新浏览器,效果如下:


多环境的属性配置


3.1

生产与开发的不同场景

面对生产与开发的不同场景,对于一些属性的值可能不同,难道我要在开发环境写的属性值,到生产环境在一个一个改吗?既然都这么说了,那当然是不用的了。我们可以在开发时候就写好两套环境中对于属性值不同需求的yml文件,然后在调用需要的yml文件就好了。

对于生产环境Girl的属性值如下:

                对于开发环境Girl的属性值如下:

我只需要在application.yml中调用不同的文件就好了,dev这个值是我开发和生产环境不同yml文件的后缀名(注意看上面两个图文件的命名)

浏览器对应的结果

第二种环境对应的配置

浏览器对应的结果

补一张到目前为止的项目目录结构,帮助理解


更多干货请前往公众号菜单栏“读我”->“干货分享”查看。



推荐阅读

Go 和 Scala 成最赚钱的语言;外包公司 400 名高管接受买断工龄协议

给 Web 开发人员推荐的通用独立 UI 组件(二)

IBM 开源软件推荐

回顾十个 Web 开发者熟悉的经典开源项目和工具

点击“阅读原文”查看更多精彩内容

登录查看更多
0

相关内容

【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【资源】100+本免费数据科学书
专知会员服务
107+阅读 · 2020年3月17日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
机器学习相关资源(框架、库、软件)大列表
专知会员服务
39+阅读 · 2019年10月9日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
VS Code Remote发布!真·远程开发
开源中国
6+阅读 · 2019年5月3日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Arxiv
5+阅读 · 2019年4月8日
TensorMask: A Foundation for Dense Object Segmentation
Arxiv
10+阅读 · 2019年3月28日
Arxiv
19+阅读 · 2018年5月17日
Arxiv
4+阅读 · 2016年12月29日
VIP会员
相关VIP内容
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
VS Code Remote发布!真·远程开发
开源中国
6+阅读 · 2019年5月3日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
Python奇淫技巧,5个数据可视化工具
机器学习算法与Python学习
7+阅读 · 2019年4月12日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
相关论文
Top
微信扫码咨询专知VIP会员