配置文件

springboot使用一个全局配置文件,配置文件名称是固定的,在资源目录下。有两种类型,propertiesyaml

  • application.properties
    • 语法:key=value
  • application.ymal
    • 语法:key: 空格 value

      配置文件位置

      image.png
      配置文件可以放在这4个地方,执行顺序如上图。

      修改启动端口号

      如下设置,重启新项目就会启动自己设置的端口
      1. #更改项目的端口号
      2. server.port=9090
      1. #设置启动的端口
      2. server:
      3. port: 9090

      .yaml文件

      springboot自动生成的那个application.properties一般不用,自己建一个文件yaml后缀的配置文件,名字必须是application.yaml
      yaml主要写法是key: value,冒号和值之间有一个空格。
      yaml对空格的要求极其严格,像对象的写法,缩进的行就说明是上一级的属性,比如student.name
      yaml的基础语法如下 ```properties

普通的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

  1. 配置文件占位符可以使用随机数
  2. ```yaml
  3. ${random.value}
  4. ${random.int}
  5. ${random.long}
  6. ${random.int(10)}
  7. ${random.int[1024,65536]}
  8. ${random.uuid}

yaml松散绑定

比如我们在yaml中写last-name这个和lastName是一样的,-后面跟着的字符默认是大写的。这就是松散绑定

配置文件注入

  1. person:
  2. name: liyadong
  3. age: 23
  4. happy: false
  5. birth: 1998/2/2
  6. maps: {k1: v1,k2: v2}
  7. lists:
  8. - code
  9. - music
  10. - girl
  11. dog:
  12. name: 旺财
  13. age: 3
  14. type: 柯基

@Value方式

使用Spring的@Value注解:支持字面量、${key}(从配置文件、环境变量中获取值)、#{spel表达式}

  1. package com.example.springboot.pojo;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class Dog {
  6. //可以用字面量写死
  7. @Value("旺财")
  8. private String name;
  9. // 从配置文件中获取,必须和配置文件中的变量名保持一致
  10. @Value("${person.dog.type}")
  11. private String type;
  12. //使用spel表达式进行计算
  13. @Value("#{1 + 2 }")
  14. private int age;
  15. }

@ConfigurationProperties方式

使用这个注解,指定yaml中编写的对象,就可以进行注入了
作用:将配置文件中配置的每一个属性的值,映射到这个组件中,告诉SpringBoot,将本类中所有的属性和配置文件中相关的配置进行绑定,prefix指定配置文件中的对象
只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,所以要加上@Component

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Indexed
  5. public @interface ConfigurationProperties {
  6. @AliasFor("prefix")
  7. String value() default "";
  8. @AliasFor("value")
  9. String prefix() default "";
  10. //true会自动忽略值类型不匹配的字段,false如果值类型不匹配将会爆出异常
  11. boolean ignoreInvalidFields() default false;
  12. //true会忽略掉对象中未知的字段,false当出现未知字段时会出现异常
  13. boolean ignoreUnknownFields() default true;
  14. }
  1. package com.example.springboot.pojo;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. import java.util.*;
  5. @Component
  6. @ConfigurationProperties(prefix = "person")
  7. public class Person {
  8. private String name;
  9. private Integer age;
  10. private Boolean happy;
  11. private Date birth;
  12. private Map<String,Object> maps;
  13. private List<Object> lists;
  14. private Dog dog;
  15. //......getset等省略
  16. }

会出现这个红色的,没有影响,看着不爽就跟着它的连接去导入一个依赖,然后重启IDEA就没有了。
image.png
上面两种方式注入了属性后,可以用自动装配得到对象。

两种方式比较

image.png

@PropertySource加载指定配置文件

用来加载指定的配置文件

@ConfigurationProperties默认从全局的配置文件中获取配置,如果想读取指定配置文件,可以在@PropertySource中进行指定。
例如:将application.yaml文件中的Person相关配置抽取到 person.yaml 配置文件中

  1. person:
  2. name: liyadong
  3. age: 23
  4. happy: false
  5. birth: 1998/2/2

在Person配置类上添加@PropertySource注解

  1. @Component
  2. @PropertySource("classpath:person.properties") // 指定读取的配置文件
  3. @ConfigurationProperties(prefix = "person")
  4. public class Person {
  5. // ....
  6. }

多环境配置文件

application-xxx.yaml,xxx表示不同的环境
比如默认环境,开发环境,测试环境等
image.png

  1. #springboot的多环境配置,可以选择激活哪一个配置文件
  2. spring:
  3. profiles:
  4. active: dev

下面这种写法,把全部环境写在一个yaml文件里面,过时了

  1. #springboot的多环境配置,可以选择激活哪一个配置文件
  2. spring:
  3. profiles:
  4. active: dev
  5. ---
  6. server:
  7. port: 8084
  8. spring:
  9. profiles: dev
  10. ---
  11. server:
  12. port: 8085
  13. spring:
  14. profiles: test

激活方式

  • 使用命令行激活

    Program arguments中添加参数:--spring.profiles.active=dev

  • 在配置文件中配置

    添加配置:spring.properties.active=dev

  • 添加 JVM 参数

    VM options中添加参数:-Dspring.profiles.active=dev

JSR-303验证

在pom.xml中导入启动器依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-validation</artifactId>
  4. </dependency>

在类上面写上注解@Validated _//数据验证_
这个注解可以写到类,方法,参数上面
然后再属性上写一些验证注解

  1. @Component
  2. @ConfigurationProperties(prefix = "person")
  3. @Validated //数据验证
  4. public class Person {
  5. @NotNull //非空
  6. private String name;
  7. @Max(30) //最大30,最小1
  8. @Min(1)
  9. private Integer age;
  10. @AssertTrue //必须为true
  11. private Boolean happy;
  12. @Past //必须是一个过去日期
  13. private Date birth;
  14. private Map<String,Object> maps;
  15. private List<Object> lists;
  16. private Dog dog;
  17. //getset略......
  18. }

具体参数如下:

  • @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=) 被注释的元素必须在合适的范围内