SpringBoot基础系列文章
SpringBoot基础(一):快速入门
SpringBoot基础(二):配置文件详解
目录
一、配置文件分类二、配置文件优先级1、不同版本优先级2、不同位置优先级 三、配置文件格式1、yml和yaml格式1.1、字符串1.2、布尔类型1.3、整数型1.4、浮点型1.5、空(Null)1.6、时间类型1.7、对象(属性和值)、Map(键值对)1.8、数组、list、set1.9、对象数组、对象list、对象set 2、properties格式 四、临时属性设置1、临时属性2、自定义配置文件 五、配置文件数据读取1、读取单一数据2、读取全部数据3、读取对象数据4、配置文件内的数据引用 六、多环境开发1、yml单一文件版2、yml多文件版3、yml独立配置多文件版
一、配置文件分类
SpringBoot提供了3种配置文件的格式
application.properties(传统格式/默认格式)server.port=81
application.yml(主流格式) server: port: 82
application.yaml server: port: 83
yml格式和yaml格式除了文件名后缀不一样,格式完全一样
二、配置文件优先级
1、不同版本优先级
springboot2.4.0及以后
版本:application.yaml ➡️ application.yml ➡️ application.propertiesspringboot 2.4.0以前
版本:application.properties ➡️ application.yml ➡️ application.yaml旧版application.properties优先级最高,新版优先级最低不同配置文件中相同配置高优先级覆盖
低优先级,不同配置文件中不同配置全部保留
2、不同位置优先级
classpath:application.yml(resources目录)
【最低-程序员】classpath:config/application.yml(resources目录下的config目录)
【项目经理】file :application.yml(jar包所在目录)
【运维】file :config/application.yml(jar包所在目录下config目录)
【最高-运维经理】 三、配置文件格式
1、yml和yaml格式
大小写敏感使用缩进表示层级关系,只允许使用空格
(不允许使用Tab键) 缩进的空格数量
不重要,只要相同层级的元素左侧对齐
即可属性名与属性值之间使用冒号+空格
作为分隔 #号 表示注释可使用-
代替驼峰,如Java中的lastName,在yml中lastName或last-name都可正确映射 1.1、字符串
字符串可不用加单引号或双引号单引号
不会转义【\n 则为普通字符串显示】双引号
会转义【\n会显示为换行符】字符串可以拆成多行,换行符会被转化成一个空格
|
开头,大文本写在下层,保留文本格式,换行符正确显示 str1: 哈喽str2: 哈喽 你好 呀str3: '哈喽 \n 你好'str4: "哈喽 \n 你好"str5: | 哈喽 你好# 转为json样式如下{"str1":"哈喽","str2":"哈喽 你好 呀","str3":"哈喽 \\n 你好","str4":"哈喽 \n 你好","str5":"哈喽\n 你好"}
1.2、布尔类型
true
、yes
、on
皆为真,不区分每个字母大小写false
、no
、off
皆为假,不区分每个字母大小写 flag1: trueflag2: Falseflag3: yesflag4: NO# 转为json样式如下{"flag1":true,"flag2":false,"flag3":true,"flag4":false}
如果出现大写字母会提示异常,不过不影响 1.3、整数型
支持二进制、八进制、十六进制num1: 666num2: 0001_0000 # 支持二进制、八进制、十六进制 # 转为json样式如下{"num1":666,"num2":4096}
1.4、浮点型
支持科学计数法f1: 1.1f2: 1.1e-2 # 使用科学计数法 # 转为json样式如下{"f1":1.1,"f2":0.011}
1.5、空(Null)
null
、Null
和~
都是空,不指定值默认也是空 str6: nullstr7: Nullstr8: ~str9: # 转为json样式如下{"str6":"","str7":"","str8":"","str9":""}
1.6、时间类型
java.util.Date
类型 # date1: 2020-05-26 这样写会抛异常date1: 2020/05/26date2: 2020/05/26 01:00:00# 转为json样式如下{"date1":1590422400000,"date3":1590426000000}
1.7、对象(属性和值)、Map(键值对)
java对象对应的yml设置属性person: name: 张三 age: 30 # Map格式方式一 map1: k1: v1 k2: v2 # Map格式方式二 map2: { key1: value1, key2: value2 }# 转为json样式如下{"age":30,"map1":{"k1":"v1","k2":"v2"},"map2":{"key1":"value1","key2":"value2"},"name":"张三"}
1.8、数组、list、set
person: #数组格式一 subject: - Java - 前端 - 大数据 #数组格式二 likes: [王者荣耀,刺激战场]# 转为json样式如下{"likes":["王者荣耀","刺激战场"],"subject":["Java","前端","大数据"]}
1.9、对象数组、对象list、对象set
person: # 对象数组格式一 pet1: - type: dog age: 1 - type: cat age: 2 # 对象数组格式一 pet2: - type: dog age: 1 - type: cat age: 2 # 对象数组格式一 pet3: [{type: dog, age: 1}, {type: cat, age: 2}]# 转为json样式如下{ "pet1":[{"age":1,"type":"dog"},{"age":2,"type":"cat"}], "pet2":[{"age":1,"type":"dog"},{"age":2,"type":"cat"}], "pet3":[{"age":1,"type":"dog"},{"age":2,"type":"cat"}]}
2、properties格式
person.name=李四person.age=18person.flag1=falseperson.date1=2019/01/01# map格式一person.map1.key1=value1person.map1.key2=value2# map格式二person.map2[k1]=v1person.map2[k2]=v2# 数组格式一person.subject[0]=javaperson.subject[1]=pythonperson.subject[2]=c++# 数组格式二person.likes=唱,跳,rap# 数组对象格式person.pet1[0].type=catperson.pet1[0].age=1person.pet1[1].type=dogperson.pet1[1].age=2# 转为json样式如下{ "age":18, "date1":1546272000000, "flag1":false, "likes":["唱","跳","rap"], "map1":{"key1":"value1","key2":"value2"}, "map2":{"k1":"v1","k2":"v2"}, "name":"李四", "pet1":[{"age":1,"type":"cat"},{"age":2,"type":"dog"}], "subject":["java","python","c++"]}
四、临时属性设置
1、临时属性
临时属性添加方式:java -jar 工程名.jar --属性名=值多个临时属性之间使用空格分隔java –jar springboot.jar --server.port=80 --logging.level.root=debug
临时属性的加载优先级要高于配置文件的idea中Program arguments(程序参数)
或VM options (虚拟机参数)
就是添加临时属性的 虚拟机参数一般用来设置系统属性
(不常用)程序参数一般用来设置应用程序选项或参数
(常用)–server.port 选项应该在 java -jar 命令之后使用,而 -Dserver.port 选项应该在 -jar 命令前使用 # 以应用参数的方式java -jar my.jar --server.port=7788# 或以 JDK 参数的方式java -Dserver.port=7788 -jar my.jar
2、自定义配置文件
方式一:使用临时属性设置配置文件名
,注意仅仅是名称,不要带扩展名 --spring.config.name=myApplication
方式二:使用临时属性设置配置文件路径
或类路径,全路径名 --spring.config.location=classpath:/myApplication.yml
五、配置文件数据读取
1、读取单一数据
使用@Value
可以读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
@RestControllerpublic class ReadConfigFile { @Value("${server.port}") private String myPort; @RequestMapping("/getValue") public String getValue(){ System.out.println(myPort);//8080 return "success"; }}
2、读取全部数据
SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment
,使用getProperty
方法获取 @RestControllerpublic class HelloController { @Autowired private Environment environment; @GetMapping("/hello") public String hello(){ String personName = environment.getProperty("person.name"); String petType = environment.getProperty("person.pet1[0].type"); return "Hello,Spring Boot !"; }}
3、读取对象数据
使用@ConfigurationProperties
注解绑定配置信息到封装类中封装类需要定义为Spring管理的bean,否则无法进行属性注入 yml配置文件
person: name: zhang3 age: 30 pets: - type: dog age: 1 - type: cat age: 2 map: k1: v1 k2: v2
属性注入的实体,使用时候直接@Autowired
注入即可
@Data@Component@ConfigurationProperties(prefix = "person")public class Person { private String name; private Integer age; private List<Pets> pets; private Map<String,String> map;}@Dataclass Pets { private String type; private Integer age;}
添加如下依赖,yml属性可以提示@ConfigurationProperties对应的实体的字段属性 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional></dependency>
4、配置文件内的数据引用
如文件属性内都具有相同的前缀
center: dataDir: /usr/local/fire/data tmpDir: /usr/local/fire/tmp logDir: /usr/local/fire/log msgDir: /usr/local/fire/msgDir
可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量
baseDir: /usr/local/firecenter: dataDir: ${baseDir}/data tmpDir: ${baseDir}/tmp logDir: ${baseDir}/log msgDir: ${baseDir}/msgDir
六、多环境开发
1、yml单一文件版
springboot 2.4.0以前版本
spring: profiles: active: dev #激活dev环境配置---spring: profiles: proserver: port: 80---spring: profiles: devserver: port: 81---spring: profiles: testserver: port: 82
springboot 2.4.0及以后的版本
spring.profiles
为过时属性配置,不过也能使用替换属性为spring.config.activate.on-profile
spring: profiles: active: dev#激活dev环境配置---spring: config: activate: on-profile: proserver: port: 80---spring: config: activate: on-profile: devserver: port: 81---spring: config: activate: on-profile: testserver: port: 82
2、yml多文件版
application.yml
主配置文件 spring: profiles: active: pro#激活pro环境#其他公共属性...
application-pro.yml
生产环境配置文件 server: port: 81
application-dev.yml
开发环境配置文件 server: port: 82
文件的命名规则为:application-环境名.yml主配置文件中设置公共配置(全局)环境分类配置文件中常用于设置冲突属性(局部)主配置文件属性和环境分类配置文件属性冲突,后者优先级高
3、yml独立配置多文件版
将所有的配置根据功能
对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下 application-devDB.ymlapplication-devRedis.ymlapplication-devMVC.yml SpringBoot2.4.0以前版本
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔spring: profiles: active: dev include: devDB,devRedis,devMVC
相当于加载dev配置时,再加载对应的3组配置主环境最后加载 当主环境dev与其他环境有相同属性时,主环境属性生效其他环境中有相同属性时,最后加载的环境属性生效 如下展示加载顺序,最后加载的优先级最高(因为覆盖了相同的属性) SpringBoot2.4.0及以后版本
比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次SpringBoot从2.4版开始使用group属性
替代include属性
,降低了配置书写量 spring: profiles: active: dev group: "dev": devDB,devRedis,devMVC "pro": proDB,proRedis,proMVC "test": testDB,testRedis,testMVC
主环境最先加载 环境中有相同属性时,最后加载的环境属性生效 如下展示加载顺序,dev在第一位,相同属性会被覆盖 总之:配置文件后加载的会覆盖先加载的配置文件属性内容