SpringBoot:SpringBoot配置文件application.properties、application.yml 和 application.ymal(2) | 您所在的位置:网站首页 › 标记属性项可以省去不写 › SpringBoot:SpringBoot配置文件application.properties、application.yml 和 application.ymal(2) |
SpringBoot配置文件
1. 配置文件格式1.1 application.properties配置文件1.2 application.yml配置文件1.3 application.yaml配置文件1.4 三种配置文件优先级和区别
2. yaml格式2.1 语法规则2.2 yaml书写2.2.1 字面量:单个的、不可拆分的值2.2.2 数组:一组按次序排列的值2.2.3 对象:键值对的集合2.2.4 复合结构
2.3 ymal组织结构
3. yaml配置文件数据读取3.1 使用功能@Value注解3.2 Enviroment对象3.3 自定义对象
4. 多环境配置4.1 yml/yaml文件进行多环境配置4.2 properties文件进行多环境配置4.3 命令行启动参数设置
5. 配置文件分类
1. 配置文件格式
我们启动服务器的默认端口是8080,我们怎样修改成自己设定的端口呐,比如设定为80端口,那么以后访问的时候就可以直接写:http://localhost/xxx,而不用写端口号了。SpringBoot已经为我们想到了,为我们提供了三种配置文件可以进行相关配置,分别为application.properties,application.yml,application.yaml。可以观察到三种配置文件都是以application.开头的,这是因为SpringBoot要求配置文件名字一定要为application.开头。下面我们一起了解一下吧。 1.1 application.properties配置文件创建SpringBoot项目会在resources目录下自动创建一个application.properties配置文件,例如在配置文件中设置服务端口号为8089. 注释掉application.properties配置文件中的端口设置,在resources目录下创建名为application.yml配置文件,在该文件中书写端口号的配置项,格式如下: server: port: 8090注意: 在:后,数据前一定要加空格。 注释掉application.yml配置文件中的端口设置,在resources目录下创建名为application.yaml配置文件,在该文件中书写端口号的配置项,格式如下: server: port: 8091注意: 在:后,数据前一定要加空格。 注意:如果创建的 application.yml 和 application.yaml 没有自动提示功能,可以参考下图把配置文件添加Configuration Files。 经过对上面三种配置文件的介绍,那么问题来了: 这三种配置文件优先级是怎样的呐???这三种配置文件有什么区别吗???针对第一个问题,我们可以做一个实验,在三个配置文件中配置不同的端口,启动服务器,查看显示的是哪一个端口,就可以确定那个配置文件的优先级高。 application.properties: 8089 application.yml: 8090 application.yaml:8091 经实验证明:application.properties配置文件的优先级要高于application.yml 和 application.yaml。 那么下面我们注释掉application.properties中的端口再次启动服务器进行查看。 经实验证明:application.yml 配置文件的优先级要高于 application.yaml。 经上述实验证明三种配置文件的优先级为:application.properties > application.yml > application.yaml。 针对问题2,则三种配置文件有什么区别呐??? 区别1:定义和定位不同 properties 翻译成中文是“属性”的意思,所以它在创建之初,就是用来在 Spring Boot 中设置属性的。yml 是 YAML 是缩写,它的全称 Yet Another Markup Language,翻译成中文是“另一种标记语言”。所以从二者的定义可以看出:它们的定位和层次是完全不同的,properties 只是用来设置一些属性配置的,而 yml 的格局和愿景更大,它的定位是“另一种标记语言”,所以从格局上来讲 yml 就甩 properties 好几条街。 区别2:语法不同 properties 和 yml 语法区别很大: 区别3:yml 更好的配置多种数据类型 yml 除了可以很好的配置基础数据类型之外,它还可以很方便的配置对象、集合等数据类型。 区别4:yml 可以跨语言 properties 格式的配置文件只适用于 Spring Boot 项目,也就是只适用于 Java 语言,而 yml 支持更多的开发语言,它可以用在 Java、PHP、Python、Ruby、JavaScript、Perl、Golang 等语言中。 2. yaml格式YAML(YAML Ain't Markup Language),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位 xml 格式如下: itcast 16 4006184000而 properties 类型的配置文件如下 enterprise.name=itcast enterprise.age=16 enterprise.tel=4006184000yaml 类型的配置文件内容如下 enterprise: name: itcast age: 16 tel: 4006184000优点: 容易阅读 yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰 容易与脚本语言交互 以数据为核心,重数据轻格式 yaml 更注重数据,而 xml 更注重格式 YAML 文件扩展名: .yml (主流).yaml上面两种后缀名都可以,目前比较流行的是 yml 。 2.1 语法规则大小写敏感 属性层级关系使用多行描述,每行结尾使用冒号结束 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键) 空格的个数并不重要,只要保证同层级的左侧对齐即可。 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔) # 表示注释 核心规则:数据前面要加空格与冒号隔开 数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔。 2.2 yaml书写 2.2.1 字面量:单个的、不可拆分的值字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。 在 YAML 中,使用“key:[空格]value”的形式表示一对键值对(空格不能省略),如 url: www.biancheng.net。 字面量直接写在键值对的“value”中即可,且默认情况下字符串是不需要使用单引号或双引号的。 name: bianchengbang若字符串使用单引号,则会转义特殊字符。 name: 'zhangsan \n lisi'输出结果为: zhangsan \n lisi若字符串使用双引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的含义 name: "zhangsan \n lisi"输出结果为: zhangsan lisi 2.2.2 数组:一组按次序排列的值YAML 使用“-”表示数组中的元素,特别注意“-”后面一定要跟着一个空格,普通写法如下: pets: - dog - cat - pig行内写法: pets: [dog,cat,pig] 2.2.3 对象:键值对的集合在 YAML 中,对象可能包含多个属性,每一个属性都是一对键值对。 YAML 为对象提供了 2 种写法: 普通写法,使用缩进表示对象与属性的层级关系。 website: name: bianchengbang url: www.biancheng.net行内写法 website: {name: bianchengbang,url: www.biancheng.net} 2.2.4 复合结构 person: name: zhangsan age: 30 pets: # 数组 - dog - cat - pig car: # car对象 name: QQ child: # child对象 name: zhangxiaosan age: 2 2.3 ymal组织结构一个 YAML 文件可以由一个或多个文档组成,文档之间使用“---”作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“---”分隔符可以省略。 --- website: name: bianchengbang url: www.biancheng.net --- website: {name: bianchengbang,url: www.biancheng.net} pets: -dog -cat -pig --- pets: [dog,cat,pig] name: "zhangsan \n lisi" --- name: 'zhangsan \n lisi' 3. yaml配置文件数据读取环境准备: 使用 @Value("表达式") 注解可以从配置文件中读取数据,注解中用于读取属性名引用方式是:${一级属性名.二级属性名……} 可以在 BookController 中使用 @Value 注解读取配合文件数据,如下: @RestController @RequestMapping("/books") public class BookController { // 读取yaml中的内容方式一 @Value("${lesson}") private String lesson; @Value("${enterprise.name}") private String name; @Value("${enterprise.age}") private String age; @Value("${enterprise.tel}") private String tel; @Value("${enterprise.subject[0]}") private String subject_0; @GetMapping("/{id}") public String getById(@PathVariable Integer id){ System.out.println("================ 方式一 ================"); System.out.println("id ===> " + id); System.out.println("lesson ==> " + lesson); System.out.println("name ==> " + name); System.out.println("age ==> " + age); System.out.println("tel ==> " + tel); System.out.println("subject[0] ==> " + subject_0); return " hello springboot3"; } }使用Environment对象,SpringBoot 会将配置文件中所有的数据封装到 Environment 对象中。如果需要使用哪个数据只需要通过调用 Environment 对象的 getProperty(String name) 方法获取。 @RestController @RequestMapping("/books") public class BookController { // 使用 `Environment` 对象的方式读取数据。 // `SpringBoot` 会将yaml配置文件中所有的数据封装到 `Environment` 对象中, // 如果需要使用哪个数据只需要通过调用 `Environment` 对象的 `getProperty(String name)` 方法获取。 @Autowired private Environment environment; @GetMapping("/{id}") public String getById(@PathVariable Integer id){ System.out.println("================ 方式二 ================"); System.out.println("lesson ==> " + environment.getProperty("lesson")); System.out.println("name ==> " + environment.getProperty("enterprise.name")); System.out.println("age ==> " + environment.getProperty("enterprise.age")); System.out.println("tel ==> " + environment.getProperty("enterprise.tel")); System.out.println("subject_0 ==> " + environment.getProperty("enterprise.subject[2]")); return " hello springboot3"; } }SpringBoot 提供了将配置文件中的数据封装到自己定义的实体类对象中的方式。具体操作如下: 将实体类 bean 的创建交给 Spring 管理。 在类上添加 @Component 注解 使用 @ConfigurationProperties 注解表示加载配置文件,在该注解中也可以使用 prefix 属性指定只加载指定前缀的数据 在 BookController 中进行注入 @Component @ConfigurationProperties(prefix = "enterprise") public class Enterprise { private String name; private String tel; private Integer age; private String[] subject; // get/set方法,构造方法,toString方法。。。。BookController的内容: @RestController @RequestMapping("/books") public class BookController { // 创建enterprise对应的实体类,将配置文件中的数据封装到我们自定义的实体类对象中的方式,方式三 @Autowired private Enterprise enterprise; @GetMapping("/{id}") public String getById(@PathVariable Integer id){ System.out.println("================ 方式三 ================"); System.out.println("name ==> " + enterprise.getName()); System.out.println("age ==> " + enterprise.getAge()); System.out.println("tel ==> " + enterprise.getTel()); System.out.println("subject ==> " + enterprise.getSubject()[1]); return " hello springboot3"; } }目前,我们都是在自己的电脑上进行开发,但是开发完之后还要交给测试环境和生成环境。这些配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要修改配置,将环境的配置改为线上环境的。 来回的修改配置会很麻烦,对于这个问题, SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不同类型的配置文件多环境开发的配置都不相同。 4.1 yml/yaml文件进行多环境配置在yml/yaml中进行配置 # 设置启用的环境 spring: profiles: active: dev # 表示使用的是开发环境的配置 # 使用 “---” 区分不同的配置 --- # 开发环境 server: port: 8080 spring: profiles: dev --- # 生产环境 server: port: 8181 spring: profiles: pro --- # 测试环境 server: port: 8082 spring: profiles: test注意: 在上面配置中给不同配置起名字的 spring.profiles 配置项已经过时。最新用来起名字的配置项是 #开发 spring: config: activate: on-profile: dev测试开发环境 测试生产环境 测试测试环境 properties 类型的配置文件配置多环境需要定义不同的配置文件 application-dev.properties 是开发环境的配置文件。我们在该文件中配置端口号为 80 server.port=8080application-test.properties 是测试环境的配置文件。我们在该文件中配置端口号为 81 server.port=8081application-pro.properties 是生产环境的配置文件。我们在该文件中配置端口号为 82 server.port=8082SpringBoot 只会默认加载名为 application.properties 的配置文件,所以需要在 application.properties 配置文件中设置启用哪个配置文件,配置如下: spring.profiles.active=dev # 启用开发环境 # spring.profiles.active=pro # 启用生产环境 # spring.profiles.active=test # 启用测试环境 4.3 命令行启动参数设置使用 SpringBoot 开发的程序都是打成 jar 包,通过 java -jar xxx.jar 的方式启动服务的。那么问题来了,如何切换环境呢?因为配置文件打到的jar包中了。 我们知道 jar 包其实就是一个压缩包,可以解压缩,然后修改配置,最后再打成jar包就可以了。这种方式显然有点麻烦,而 SpringBoot 提供了在运行 jar 时设置开启指定的环境的方式,如下 java –jar xxx.jar –-spring.profiles.active=test那么这种方式能不能临时修改端口号呢?也是可以的,可以通过如下方式 java –jar xxx.jar –-server.port=88当然也可以同时设置多个配置,比如即指定启用哪个环境配置,又临时指定端口,如下 java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test原始配置:开发环境dev、测试端口8080 利用--server.port指令修改端口为8089 利用--spring.profiles.active指令切换配置环境 将--server.port 和 --spring.profiles.active 结合使用 大家进行测试后就会发现命令行设置的端口号优先级高(也就是使用的是命令行设置的端口号),配置的优先级其实 SpringBoot 官网已经进行了说明,参见 :https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config 5. 配置文件分类问题提出:有这样的场景,我们开发完毕后需要交给测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置,如下 java –jar springboot.jar –-spring.profiles.active=test --server.port=85 --server.servlet.context-path=/heima --server.tomcat.connection-timeout=-1 …… …… …… …… ……针对这种情况,SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。 SpringBoot 中4级配置文件放置位置: 1级:classpath:application.yml2级:classpath:config/application.yml3级:file :application.yml4级:file :config/application.yml说明: 级别越高优先级越高 SpringBoot项目中的配置文件是分级的,可以分为1,2,3,4级 第1级就是resources下面的配置文件: application.yml 第2级是在resources/config目录下的配置文件:application.yml, 启动项目发现用的端口号为8081,说明此配置文件的优先级较高。 第3级是SpringBoot项目package后,在目录下面创建的application.yml配置文件 在Dos窗口中启动项目,发现项目端口号为8082,说明此配置文件的优先级要高于前两个配置文件的优先级。 第4级是SpringBoot项目package后,在目录下面创建的config/application.yml配置文件 在Dos窗口中启动项目,发现项目端口号为8083,说明此配置文件的优先级要高于前三个配置文件的优先级。 |
CopyRight 2018-2019 实验室设备网 版权所有 |