【02】SpringBoot-配置方式


文章目录

  • 【02】SpringBoot-配置方式
  • 一、配置文件
  • 1.1、yaml语法
  • 1.2、Properties文件配置
  • 1.3、配置文件占位符
  • 1.4 补充:
  • 二、JSR303校验
  • 三、几个注解的区别
  • 四、多环境切换
  • 4.1 配置文件的位置及优先级
  • 4.2 环境切换
  • 4.3 外部配置加载顺序


一、配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的;

  • application.properties
  • application.yml

配置文件的作用:修改SpringBoot自动配置的默认值;

1.1、yaml语法

  1. 格式:key: value(需要使用一个空格隔开
  2. 配置文件类型加载顺序:

yml>yaml>properties (后面会覆盖前面的配置)

  1. 基本语法:
# 普通数据
name: libai
# 对象的配置
person:
  name: libai
  age: 2
  addr: jiangxi

# 行内对象配置
#student: {name: libai, age: 18, addr: shanghai}
# 配置端口,项目虚拟目录,覆盖springboot配置
server:
    port: 8083
    servlet:
      context-path: /hello
# 配置数组、集合(List,Set
# 1,数组内容:字符串
season:
  - spring
  - summer
  - winter
  - autumn

# 行内配置,用的不多
#season: [spring,summer,winter,autumn]
#2,集合内容:对象数据
students:
  - name: libai
    age: 12
    addr: beij
  - name: lishi
    age: 13
    addr: hebei
    
# 行内配置对象
#student2: [{name: lishi,age: 12,addr: beij},{name: lishi2,age: 112,addr: beij}]
# Map配置
map:
  name1: xuxu
  name2: yaya
  1. 示例:

使用的注解:

作用:

@ConfigurationProperties(prefix="前缀名")

和配置文件建立关联,并使用指定的前缀去匹配对象属性

  • 可以和application.yamlapplication.properties建立关联
  • 要求对象提供getter/setter()方法
@Component // 放入IOC容器
@ConfigurationProperties(prefix = "book") // 
@Validated // JSR303校验
public class Book {

    @NotNull
    private String name;
    private Author author;
    private Integer price;

    private boolean isPublic;
    private Date pubTime;
    private List<Object> list;
    private Map<String,String> maps;

    //getter()/setter()省略
}

对应的application.yml

# 还可以使用SPEL生成随机数,以及复用配置好的对象属性
book:
  name: 活着${random.uuid}
  author:
    name: 余华
    age: 100${book.price}
  price: 18
  isPublic: false
  pubTime: ${myTime:1999/11/11}  # 默认使用myTime,没有使用1999/11/11
  list:
    - adult
    - child
    - older
  maps:
    key1: 不错哦
    key2: 很好看

# 另外配置一个时间
myTime: 1998/12/12

application.properties

对应的properties应该怎样配置?

book.name=活着
book.author.name=余华
book.author.age=23
book.price=100
book.isPublic=true
book.pubTime=1999/11/11
book.list={adult,child,older}
book.maps.key1=val1
book.maps.key2=val2

1.2、Properties文件配置

  1. application.properties
# 属性注入
p.name=BaoBao
p.age=12
  1. 关联类:

使用的注解:

作用:

@PropertySource(value = “classpath:文件名”)

表示使用指定的配置文件,配合@Value注解使用

@Value("${键名}")

取出配置文件中”键名“对应的数据

注意:

  • @PropertySource只是将被注解的类和配置文件建立关联,需要配合@Value一个个取出数据
  • @Value可以单独使用,也可配合上面的注解使用
@Component
@PropertySource(value = "classpath:application.properties")
public class User {

    @Value("${p.name}")
    private String name;
    @Value("${p.age}")
    private Integer age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

什么是松散绑定?比如:配置文件中last-name可以绑定到对象属性lastName

  1. properties配置文件乱码解决:

spring boot常用配置 spring boot如何配置_java

1.3、配置文件占位符

spring boot常用配置 spring boot如何配置_java_02

1.4 补充:

1.使用指定位置的配置文件

spring.config.location=classpath:/myconfig/

2.使用指定名称的配置文件

spring.config.name=app
# app.yml 或 app.properties

二、JSR303校验

位于import javax.validation.constraints.Email;

Constraint

详细信息

@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(value)

被注释的元素必须符合指定的正则表达式

表 2. Hibernate Validator 附加的 constraint

Constraint

详细信息

@Email

被注释的元素必须是电子邮箱地址

@Length

被注释的字符串的大小必须在指定的范围内

@NotEmpty

被注释的字符串的必须非空

@Range

被注释的元素必须在合适的范围内

使用示例:

注解中message字段表示错误提示信息

import org.springframework.stereotype.Component;
import javax.validation.constraints.Email;

@Component
public class Author {

    @Email(message = "邮箱格式错误") // 添加了一个邮件校验
    private String name;
    @NotNull(message="年龄不能为空")
    private int age;

   	// get,set,toString()
}

spring boot常用配置 spring boot如何配置_springboot配置_03

三、几个注解的区别

注解名称

作用:

@PropertySource

使用指定的配置文件,不能单独使用。需要配合@Value

@ImportResource

导入Spring的配置文件,让配置文件里面的内容生效;Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring的配置文件生效,加载进来;@lmportResource标注在一个配置类上

@Value

默认也是从全局配置文件获取值,但可以配合@PropertySource从指定配置文件获取值

@ConfigurationProperties

默认从全局配置文件中获取值,通过前缀(prefix)匹配值

spring boot常用配置 spring boot如何配置_springboot配置_04

四、多环境切换

4.1 配置文件的位置及优先级

优先级:从上到下,依次降低。优先使用高优先级配置,然后再配合其他优先级形成互补配置

spring boot常用配置 spring boot如何配置_java_05

spring boot常用配置 spring boot如何配置_spring boot_06

我们还可以通过spring.config.location来改变默认的配置文件

位置项目打包好以后,可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件认加载的这些配置文件共同起作用形成互补配置;

4.2 环境切换

  1. 再创建2个配置文件
  • application-dev.properties:开发环境
  • application-test.properties:测试环境

application.properties中指定使用哪一个配置

# 使用dev环境
spring.profiles.active=dev
  1. yml支持多文档块方式 【使用分隔符—
# 使用分隔符代表多个文档
# active:指定当前使用的环境
spring:
  profiles:
    active: dev
---
# 开发环境
server:
  port: 8084
spring:
  profiles: dev

---
# 测试环境
server:
  port: 8085
spring:
  profiles: test

4.3 外部配置加载顺序

SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会 形成互补配置

  1. 命令行参数

所有的配置都可以在命令行上进行指定 ,多个配置参数使用空格隔开

# 多个配置用空格分开; --配置项=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
  1. 来自java:comp/env的JNDI属性
  2. Java系统属性(System.getProperties())
  3. 操作系统环境变量
  4. RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找; 优先加载带profile开发环境) 】

注意:Jar包和外部配置文件处于同一目录

  1. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  2. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

再加载不带profile的

  1. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  2. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  3. @Configuration注解类上的@PropertySource
  4. 通过SpringApplication.setDefaultProperties指定的默认属性