4.springboot的配置
springboot配置文件:该文件是一个全局配置文件,该配置文件的名称是固定的。
- application.properties
- 该文件的语法:key=value
- application.yaml(优先级高于properties文件)
- 该文件的语法:key: value 注冒号后面有空格
该文件的作用:springboot的自动配置,已经帮我们配置好了默认值,如果你需要修改就可以通过该配置文件修改默认值。
-
例如
properties:server.port=8080
yaml:server:
port: 8080
该文件能配置什么?通过了解原理,可以知道他是如何配置的,能配置什么。
我们先了解yaml,再了解配置原理。
4.1yaml语法与核心配置文件的配置原理(application.yaml)
YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
该标记语言以数据为中心,而不是以标记语言为中心!
对比xml和
xml配置:
<server>
<port>8080</port>
</server>
yaml配置(对空格的要求十分高)
server:
prot: 8080
#普通的key-value
name: ariverh
#对象
student:
name: ariverh
age: 22
#行内写法
student: {name: ariverh,age: 22}
#数组
pets:
- cat
- dog
pets: [cat,dog]
properties配置
server.port=8080
yaml可以配置类中的属性赋值,即注入配置类。
yaml可以给实体类赋值,即注入。
通过yaml给实体类赋值:
Cat类:
@Component
public class Cat {
@Value("cat")
private String name;
@Value("1")
private String age;
public Cat() {
}
public Cat(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
Person类:
@Component
@ConfigurationProperties(prefix = "person")
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 Cat cat;
public Person() {
}
public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> maps, List<Object> lists, Cat cat) {
this.name = name;
this.age = age;
this.happy = happy;
this.birth = birth;
this.maps = maps;
this.lists = lists;
this.cat = cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getHappy() {
return happy;
}
public void setHappy(Boolean happy) {
this.happy = happy;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", happy=" + happy +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", cat=" + cat +
'}';
}
}
application.yaml
person:
name: ariverh
age: 22
happy: true
birth: 2020/12/3
maps: {k1: v1,k2: v2}
lists:
- a
- b
- c
cat:
name: cat
age: 3
测试类:
@SpringBootTest
class MyfirstspringBootApplicationTests {
@Autowired
private Person p;
@Test
void contextLoads() {
System.out.println(p);
}
}
结果:
结论
@ConfigurationProperties作用:将配置文件中配置的每一个属性的值,映射到这个组件中;告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应。
@configurationProperties可以将实体类与配置文件application.yaml中的下的某个key绑定,那么我们把实体类换成配置类。那么我们就可以通过配置文件给配置类中的某个属性进行赋值。
-
springboot的本质是通过启动器,将对应的依赖导入。再读取自动配置包下的所有自动配置类,自动配置类可以自动将配置类导入spring容器中,配置信息类可以给配置类赋予默认值。但是这些配置类不一定生效,自由再对应依赖存在的情况下才会生效(即在pom文件中导入启动器)。这些配置类中属性都有默认值,配置信息类赋予的。但是我们该怎么修改这些默认值呢?那么我们就通过@configurationProperties把配置类或者配置信息类与配置文件绑定起来。通过配置文件修改配置类中的属性。
-
**配置文件:**application.yaml
-
**自动配置包:**该包下有所有的自动配置类
-
**自动配置类:**能够进行自动配置,加载配置类和配置信息类,通过配置信息类给配置类中的属性赋予默认值。
-
**配置类:**配置类,能偶配置一些东西。@EnableConfigurationProperties加载对应的配置信息类
比如:以SpringMVC配置为例。配置前端控制器,配置处理器映射器,配置处理器适配器,配置视图解析器,配置拦截器等配置。这些配置都需要默认的值,这些默认的值就是从配置信息类中获得。
-
**配置信息类:**该类存储类很多配置类的一些默认值。通过@ConfigurationProperties与配置文件中的某个key绑定。
-
类与配置文件绑定通过@ConfigurationProperties
类通过获取指定的文件中的信息赋值,可以通过@PropertySource加载指定文件,并通过@Value("${x}")获取指定文件中的信息进行赋值
@ConfigurationProperties与@Value区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂数据类型封装 | 支持 | 不支持 |
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
4.2jrR303校验与多环境配置
4.2.1校验注解
@Validated//在类上注解即该类开启数据校验
//通过在标有@Validated的类中属性上添加指定的校验注解,就会进行校验
//常见的校验注解
@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 对象是否符合正则表达式的规则
//.......等等
//除此以外,我们还可以自定义一些数据校验规则
4.2.2多环境位置和配置文件位置
多配置文件环境配置:
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
多配置文件:
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;
例如:
application-test.properties 代表测试环境配置
application-dev.properties 代表开发环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境:
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring.profiles.active=dev
位置文件的种类:
优先级高:application.yaml
优先级低:application.properties
配置文件课存放的位置:
优先级1:file:./config/application
优先级2:file:./application
优先级3:classpath:/config/application
优先级4:classpath:/application
yaml多模块
和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称
注意:如果yaml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!