SpringBoot 配置文件
配置⽂件作用
配置文件是为了解决硬编码的问题,把一些可能会发生改变的信息放到一个集中的地方当我们启动某个程序时应用程序就从我们配置的文件中读取数据并进行加载运行
硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死"
例如字体的大小
如果采⽤硬编码的⽅式,就直接在程序中指定字体⼤⼩,所有的⽤⼾使⽤的都是同⼀个字体⼤⼩
但我们现实中会根据用户的喜好来进行字体的大小显示
在SpringBoot中⽀持并定义了配置⽂件的格式, 也在另⼀个层⾯达到了规范其他框架集成SpringBoot的⽬的
例如
项⽬的启动端⼝
SpringBoot内置了Tomcat服务器,默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他 应⽤程序占⽤了,所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号
数据库的连接信息
包含⽤⼾名和密码的设置
第三⽅系统的调⽤密钥等信息
⽤于发现和定位问题的普通⽇志和异常⽇志等
配置文件
修改端口号 我们默认的端口号时8080 可以修改
application.properties 文件
让我们的端口号就被改成了9090
配置⽂件的格式
Spring Boot 配置⽂件有以下三种
application.properties
application.yml
application.yaml
其中yml是yaml的缩写 和yaml的使用方法一样
当应用启动时SpringBoot会⾃动从classpath路径找到并加载这三种文件
注意:
.properties文件和.yml文件可以在一个项目之中存在当两个同时存在时会以.properties为主(.properties)的优先级更高 但是我们通常会取用一种配置文件格式
.properties配置文件说明
.properties的键值的形式配置的key和value之间是以"=“之间连接的 可以使用”#"来添加注释信息
例如:
# 应用æœåŠ¡ WEB 访问端å£
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
读取配置文件
如果要在项目读取配置文件的内容可以使用@value注解实现注解使用"${}"格式读取
properties 配置如下:
package com.demos.Controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PropertiesController {@Value("${mykey.key1}")private String key1;@RequestMapping("/key")public String key(){return "读取到值:" + key1;}}
properties的缺点
从上述配置看到properties很啰嗦
我们可以使用yml配置文件格式化
yml配置⽂件
基本语法
yml是树形结构的配置⽂件 语法是key:value
key和value之间使用英文冒号加空格方式组成(空格不能省略)
例如
使用yml连接数据库
使用示例:
key1: hello
spring: datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
它和和properties连接数据库就显得简洁了许多
yml配置不同数据类型及nul
#字符串
spring.value: Hello
#整数
int.value: 10
#浮点数
float.value: 3.14
#Null ~代表null
null.value: ~
#""空字符 也可以后面什么都不加
empty.value: ""
yml配置读取
yml读取配置的⽅式和properties相同,使用@Value 注解即可,实现代码如下
yml配置:
注意: value值加单双引号
字符串默认不⽤加上单引号或者双引号
如果加英⽂的单双引号可以表⽰特殊的含义
例如:
@RestController
public class ReadYml {@Value("${string.hello}")private String hello;@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@RequestMapping("/ymlKey")public String key(){System.out.println(str1);System.out.println(str2);System.out.println(str3);return "yml";}
}
结果:
可以看到
字符默认不用加上单引号或者双引号
单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串
双引号不会转义字符串⾥⾯的特殊字符,特殊字符会表⽰本⾝的含义
单引号会转义\n不再表⽰换⾏了,⽽是表⽰⼀个普通的字符串
双引号不会转义,表⽰\n表⽰的是它本⾝的含义,就是换⾏
配置对象
还可以在yml中配置对象
例如
student:id: 1name: 张三age: 18
也可以使用这种写法
student2: {id: 2,name: 李四,age: 18}
这时我们需要另外一个注解@ConfigurationProperties来读取
例如:
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {private int id;private String name;private int age;
}
调⽤类的实现
@RestController
public class StudentController {@Autowiredprivate Student student;@RequestMapping("/readStudent")public String readStudent(){return student.toString();}
}
配置集合
配置⽂件也可以配置list集合
例如:
dbtypes:name:- mysql- sqlserver- db2
集合的读取和对象⼀样
例如
maptypes:map:k1: key1k2: key2k3: key3
或者
maptypes2: {map: {k1: key1, k2: key2, k3: key3}}
读取
@ConfigurationProperties("maptypes")
@Component
@Data
public class MapConfig {private HashMap<String,String> map;
}
@RestController
public class ReadYml3 {@Autowiredprivate MapConfig mapConfig;@RequestMapping("/readMap")public String readMap(){return mapConfig.toString();}
}
结果
yml的优缺点
优点可读性高易于理解
⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.
⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在 Golang,Python,Ruby,JavaScript中也可以使⽤
缺点
不适合写复杂的配置文件
如properties格式
keycloak.security[0].authRoles[0]= userkeycloak.security[0].collections[0].name = ssologinurlkeycloak.security[0].collections[0].patterns[0] = /login/*
变成yml
keycloak:security[0]:- authRoles[0]: - usercollections[0]:- name: ssologinurlpatterns[0]: /login/*