SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
第一种、application.properties
第二种、application.yml
配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
<server> <port>8080<port> </server>
yaml配置:
server: prot: 8080
说明:语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
字面量:普通的值 [ 数字,布尔值,字符串 ]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
key: value
一、yaml
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: "study \n yaml" 输出 :sutdy 换行 yaml
'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘study \n yaml’ 输出 :study \n yaml
#key: value #普通的key: value name: studyYAML #对象 student: name: zhangsan age: 3 #行内写法 Student: {name: zhangsan,age: 3} #数组 pets: - cat - dog - pig #行内写法 Pets: {cat,dog,pig}
二、properties
name=studyYAML student.name=zhangsan student.age=3
一、新建一个springboot项目,项目名称【springboot-02-config】
二、新建pojo包编写Dog和Person实体类
1、Dog:
package com.kuang.pojo; import org.springframework.stereotype.Component; @Component//注册bean到容器中 public class Dog { private String name; private Integer age; //有参无参构造、get、set方法、toString()方法 }
2、Person:
package com.kuang.pojo; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; @Component//注册bean到容器中 public class Person { private String name; private Integer age; private Boolean happy; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; //有参无参构造、get、set方法、toString()方法 }
三、我们原来是如何给bean注入属性值的!@Value,给狗狗类测试一下:
@Component //注册bean public class Dog { @Value("旺财") private String name; @Value("18") private Integer age; }
四、在SpringBoot的测试类下注入Dog输出一下;
@SpringBootTest class Springboot02ConfigApplicationTests { @Autowired //将Dog自动注入进来 private Dog dog; @Test void contextLoads() { System.out.println(dog); } }
运行结果输出成功!
这是原生的方式,特别麻烦,下面我们用YAML方式注入(先删除Dog里面的@value注解)
五、在resources文件下新建一个application.yaml文件,给Person赋值
person: #对应实体类的名字 name: 张三 age: 19 #Boolean happy: true #Date birth: 2021/6/28 #集合 maps: {key1: value1, key2: value2} #数组 lists: - code - music - girl #对象 dog: name: 旺财 age: 3
六、在Person类中配置@ConfigurationProperties(prefix = "person")注解
可以在pom.xml中添加以下配置文件依赖即可解决
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
七、修改测试类
@SpringBootTest class Springboot02ConfigApplicationTests { @Autowired //将Person自动注入进来 private Person person; @Test void contextLoads() { System.out.println(person); } }
八、运行测试,输出结果
person: name: 张三${random.uuid} #赋值随机uuid age: ${random.int} #赋值随机整形 #Boolean happy: true #Date birth: 2021/6/28 #集合 maps: {key1: value1, key2: value2} #数组 lists: - code - music - girl #对象 dog: name: ${person.hello:hello}_旺财 #假设person。hello不存在,赋值hello给旺财,假设存在,赋值已有的值给旺财 age: 3
输出结果
@Component @ConfigurationProperties(prefix = "dog") public class Dog { private String firstName; private Integer age;
名字不一致问题
dog: first-name: 小毛 age: 2
运行测试:
结论:
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;
@Component //注册bean @ConfigurationProperties(prefix = "person") @Validated //数据校验 public class Person { @Email(message="邮箱格式错误") //标注name的值必须是邮箱格式 private String name; }
常用参数
@NotNull(message="名字不能为空") private String userName; @Max(value=120,message="年龄最大不能查过120") private int age; @Email(message="邮箱格式错误") private String email; 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. @NotEmpty 检查约束元素是否为NULL或者是EMPTY. Booelan检查 @AssertTrue 验证 Boolean 对象是否为 true @AssertFalse 验证 Boolean 对象是否为 false 长度检查 @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 @Length(min=, max=) string is between min and max included. 日期检查 @Past 验证 Date 和 Calendar 对象是否在当前时间之前 @Future 验证 Date 和 Calendar 对象是否在当前时间之后 @Pattern 验证 String 对象是否符合正则表达式的规则
properties多环境切换
一、新建application-dev.properties文件(开发环境)
server.port=8082
二、新建application-test.properties文件(测试环境)
server.port=8081
三、修改主配置文件application.properties
#springboot的多环境配置:可以选择激活指定的配置文件 spring.profiles.active=dev
四、运行测试
启动了开发环境下的8082端口
yaml多环境切换,删除properties文件
一、修改application.yaml文件
server: port: 8081 spring: profiles: active: test #指定test的环境 --- server: port: 8082 spring: profiles: dev #环境名称 --- server: port: 8083 spring: profiles: test
二、运行测试