2.配置文件及用法

yml语法格式

# yml语法格式:
# key:空格value(代表配置的键值对关系)
# 使用缩进达到跟properties的 . 的功能(层级关系)
# 左对齐同一列数据(相同缩进),代表同一个层级关系

value的一般写法、高级写法

# value的一般写法
# 字符串默认是不需要加双引号(或者单引号)的
# 双引号:不会转义字符串中的特殊字符(特殊字符就表示其本身标识的含义,/n就是换行)
# 单引号:会转义字符串中的特殊字符(特殊字符最终标识就是其本身的字符串,不然/n输出就是/n字符串)
user:
  userName: tom
  userAge: 20

# value的高级写法
# 用户信息
user:{userName:tom,userAge: 20}
users:
 - mark
 - marry
 - zuck
users: [ mary,marry,zuck ]

自定义配置

# 自定义配置信息
user:
  userId: U0001
  user_name: Root
  userAge: 20
  adult: true
  birth_day: 2000/07/16 14:14:14
  left_money: 6666.6
  nick_name: yyds
  role:
    roleId: R101
    roleName: admin
    userEmail: 123@123.com

yml与beans映射

分为批量映射和单个映射

​ 批量映射关键字:@ConfigurationProperties(prefix = "user"),需要配置@Conponent一起使用,配置前缀

​ 单个映射关键字:@Value

​ 指定映射:@PropertySource(value = "classpath:user.properties")

package com.lcywings.sbt.springbiit02configlcywings.beans;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created on 2021/7/16.
 * <p>
 * Author : Lcywings
 * <p>
 * Description : 读取系统配置文件中自定义配置主要方式,两种
 * 方式1:批量自动读取,使用注解:@ConfigurationProperties
 * 注意:
 * 1.此注解不能单独使用,必须配置@Conponent使用(自动读取必须是容器中的组件)
 * 2.必须指定要读取的配置的前缀标识(prefix="xxx.xxx")
 * 优点:支持松散绑定-比如驼峰映射(识别 _ 或者 - )
 * 支持复杂类型封装-比如实体map,list等
 * 支持数据校验-比如实体增加@Email注解,必须读取的配置信息为邮件地址
 *
 * 方式2:单个属性读取,使用注解:@Value
 * 注意:
 * 此注解是能写在实体属性上,不支持松散绑定语法(必须跟配置一致),不支持复杂类型封装
 * 读取配置由两种写法:${}和#{}
 * ${xxx.xx}:用于读取配置文件中的自定义配置,还可以设置默认值
 * #{xxx.xx}:用于读取容器中的已有的实体的属性值,还可以设置固定值
 *
 * 方式三 扩展写法,防止有些自定义配置写在单独配置文件中
 * 一般不用
 * @PropertySource(value = "classpath:user.properties")
 */
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    /**
     * 用户编号
     */
    //@Value("${user.userId}")
    private String userId;

    /**
     * 用户id
     */
    //@Value("${user.user_name}")
    private String userName;

    /**
     * 用户名
     */
    //@Value("${user.userAge:18}")
    private Integer userAge;

    /**
     * 是否成年
     */
    //@Value("${user.adult}")
    private Boolean adult;

    /**
     * 用户生日
     */
    //@Value("${user.birth_day}")
   // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date birthDay;

    /**
     * 账户余额
     */
   // @Value("#{8888.8}")
    private Double leftMoney;

    /**
     * 用户昵称
     */
   // @Value("#{user.userName}")
    private String nick_name;

    /**
     * 角色
     */
//    @Value("${role}")
    private Role role;
}

@Validated格式校验

限制说明
@Null限制只能为null
@NotNull限制必须不为null
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty ,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@AssertFalse限制必须为false
AssertTrue限制必须为true
Size(max,min)限制字符长度必须在min到max之间
@Future验证日期为当前时间之后
FutureOrPresent验证日期为当前时间或之后
@Past限制日期为当前时间之前(高版本 2.1.6(支持date,也支持localDate,@past校验过去时间))(低版本1.5.9 (支持date,不支持localDate,@past校验过去时间))
@PastOrPresent限制日期为当前时间或之前
@Max(value)限制必须为一个不大于指定值的数字
@Min(value)限制必须为一个不小于指定值的数字
DecimalMax(value)限制必须为一个不大于指定值的数字
DecimalMin(value)限制必须为一个不小于指定值的数字
Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Negative限制必须为负整数
@NegativeOrZero限制必须为负整数或零
@Positive限制必须为正整数
@PositiveOrZero限制必须为正整数或零
Pattern(value)限制必须符合指定的正则表达式
Email限制必须为email格式

这玩意校验不对会报错,会报MethodArgumentNotValidException这个错

根目录

根目录@PropertySource(value = "classpath:user.properties")

自定义配置beans

/**
 * @author : Lcywings
 * @date : 2021/7/16 16:10
 * @acl : true
 * @description : 添加一个角色对象到容器中
 *
 */
@Bean
public Role role() {
    Role role = new Role();
    role.setRoleId("R102");
    role.setRoleName("开发");
    role.setUserEmail("234@234.com");
    return role;
}

配置优先顺序

配置文件加载的位置:springboot启动默认扫描配置文件位置顺序:
下面四个位置中的application.properties或者application.yml

  1. 项目根路径下config目录中的配置
  2. 项目跟路径下的配置文件
  3. 项目resources目录下的config目录中的配置文件
  4. 项目resources目录下的配置文件

四个配置文件:互补配置-不是只有优先级高的配置文件生效,而是优先级高的配置文件会自动覆盖低优先级的配置文件。如果配置在其他配置文件中不存在,也可以生效。

@Conditional

spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:

  • @ConditionalOnBean:当容器里有指定Bean的条件下
  • @ConditionalOnClass:当类路径下有指定类的条件下
  • @ConditionalOnExpression:基于SpEL表达式作为判断条件
  • @ConditionalOnJava:基于JV版本作为判断条件
  • @ConditionalOnJndi:在JNDI存在的条件下差在指定的位置
  • @ConditionalOnMissingBean:当容器里没有指定Bean的情况下
  • @ConditionalOnMissingClass:当类路径下没有指定类的条件下
  • @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
  • @ConditionalOnProperty:指定的属性是否有指定的值
  • @ConditionalOnResource:类路径是否有指定的值
  • @ConditionalOnSingleCandidate:当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean
  • @ConditionalOnWebApplication:当前项目是Web项目的条件下。

上面@ConditionalOnXXX都是组合@Conditional元注解,使用了不同的条件Condition。@ConditionalOnWebApplication注解:@Conditional(OnWebApplicationCondition.class)

Q.E.D.