配置文件
springboot使用一个全局配置文件,配置文件名称是固定的,在资源目录下。有两种类型,properties
和yaml
- application.properties
- 语法:key=value
- application.ymal
- 语法:key: 空格 value
配置文件位置
配置文件可以放在这4个地方,执行顺序如上图。修改启动端口号
如下设置,重启新项目就会启动自己设置的端口#更改项目的端口号
server.port=9090
#设置启动的端口
server:
port: 9090
.yaml文件
springboot自动生成的那个application.properties一般不用,自己建一个文件yaml后缀的配置文件,名字必须是application.yaml
yaml主要写法是key: value
,冒号和值之间有一个空格。
yaml对空格的要求极其严格,像对象的写法,缩进的行就说明是上一级的属性,比如student.name
yaml的基础语法如下 ```properties
- 语法:key: 空格 value
普通的key-value
name: lyd
对象
student: name: lyd age: 23
行内写法
people: {name: lyd,age: 24}
数组
pets:
- cat
- dog
- pig
-
pet2s: [cat,dog,pig]
```
yaml的强大之处在于它可以给实体类赋值。
yaml占位符
在yaml中还可以用占位符,引用等,语法就是用${}
```yaml person: name: liyadong age: ${random.int} happy: false birth: 1998/2/2 maps: {k1: v1,k2: v2} lists:- code
- music
- girl dog: name: ${dog.name} age: ${dog.age}
dog: name: 来福 age: 4
配置文件占位符可以使用随机数
```yaml
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
${random.uuid}
yaml松散绑定
比如我们在yaml中写last-name这个和lastName是一样的,-后面跟着的字符默认是大写的。这就是松散绑定
配置文件注入
person:
name: liyadong
age: 23
happy: false
birth: 1998/2/2
maps: {k1: v1,k2: v2}
lists:
- code
- music
- girl
dog:
name: 旺财
age: 3
type: 柯基
@Value方式
使用Spring的@Value
注解:支持字面量、${key}
(从配置文件、环境变量中获取值)、#{spel表达式}
package com.example.springboot.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Dog {
//可以用字面量写死
@Value("旺财")
private String name;
// 从配置文件中获取,必须和配置文件中的变量名保持一致
@Value("${person.dog.type}")
private String type;
//使用spel表达式进行计算
@Value("#{1 + 2 }")
private int age;
}
@ConfigurationProperties方式
使用这个注解,指定yaml中编写的对象,就可以进行注入了
作用:将配置文件中配置的每一个属性的值,映射到这个组件中,告诉SpringBoot,将本类中所有的属性和配置文件中相关的配置进行绑定,prefix指定配置文件中的对象
只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,所以要加上@Component
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
//true会自动忽略值类型不匹配的字段,false如果值类型不匹配将会爆出异常
boolean ignoreInvalidFields() default false;
//true会忽略掉对象中未知的字段,false当出现未知字段时会出现异常
boolean ignoreUnknownFields() default true;
}
package com.example.springboot.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.*;
@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 Dog dog;
//......getset等省略
}
会出现这个红色的,没有影响,看着不爽就跟着它的连接去导入一个依赖,然后重启IDEA就没有了。
上面两种方式注入了属性后,可以用自动装配得到对象。
两种方式比较
@PropertySource加载指定配置文件
用来加载指定的配置文件
@ConfigurationProperties
默认从全局的配置文件中获取配置,如果想读取指定配置文件,可以在@PropertySource
中进行指定。
例如:将application.yaml文件中的Person相关配置抽取到 person.yaml 配置文件中
person:
name: liyadong
age: 23
happy: false
birth: 1998/2/2
在Person配置类上添加@PropertySource
注解
@Component
@PropertySource("classpath:person.properties") // 指定读取的配置文件
@ConfigurationProperties(prefix = "person")
public class Person {
// ....
}
多环境配置文件
application-xxx.yaml
,xxx表示不同的环境
比如默认环境,开发环境,测试环境等
#springboot的多环境配置,可以选择激活哪一个配置文件
spring:
profiles:
active: dev
下面这种写法,把全部环境写在一个yaml文件里面,过时了
#springboot的多环境配置,可以选择激活哪一个配置文件
spring:
profiles:
active: dev
---
server:
port: 8084
spring:
profiles: dev
---
server:
port: 8085
spring:
profiles: test
激活方式
使用命令行激活
在
Program arguments
中添加参数:--spring.profiles.active=dev
在配置文件中配置
添加配置:
spring.properties.active=dev
添加 JVM 参数
在
VM options
中添加参数:-Dspring.profiles.active=dev
JSR-303验证
在pom.xml中导入启动器依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在类上面写上注解@Validated _//数据验证_
这个注解可以写到类,方法,参数上面
然后再属性上写一些验证注解
@Component
@ConfigurationProperties(prefix = "person")
@Validated //数据验证
public class Person {
@NotNull //非空
private String name;
@Max(30) //最大30,最小1
@Min(1)
private Integer age;
@AssertTrue //必须为true
private Boolean happy;
@Past //必须是一个过去日期
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
//getset略......
}
具体参数如下:
- @Null 被注释的元素必须为 null
- @NotNull 被注释的元素必须不为 null
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的最大小数的位数
- @Past 被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
- @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
- @NotBlank(message =) 验证字符串非 null,且长度必须大于 0
- @Email 被注释的元素必须是电子邮箱地址
- @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
- @NotEmpty 被注释的字符串的必须非空
- @Range(min=,max=,message=) 被注释的元素必须在合适的范围内