Spring Boot ymal 语法 与 @ConfigurationProperties 、@Value 注值、 ${xxx} 占位符

目录

YAML 语法规范

@ConfigurationProperties 注值

@Value 取值注入

@Value VS @ConfigurationProperties

配置文件 ${xxx} 占位符


YAML 语法规范

1、Spring Boot 使用一个全局配置文件来对一些默认配置值进行修改,比如Tomcat端口等

2、配置文件名字约定为 “application.properties” 或者 “application.yml”

3、配置文件放必须放在src/main/resources目录或者类路径/config下

4、yml 全称 YAML(YAML Ain’t Markup Language),以数据为中心,比 json、xml 等更适合做配置文件

5、语法规范参考网址:http://www.yaml.org

YAML 语法

1、k:(空格)v:表示一对键值对,注意必须有空格,如 info: good

2、使用缩进表示层级关系,缩进时不允许使用Tab键,只允许使用空格,具体个数没有强制限制,只要相同层级的元素左侧对齐即可(通常约定使用两个2个空格)

3、大小写敏感:

server:
  port: 8082

YAML 支持以下数据结构

springBoot 接收实体的时候给字段设置默认值 springboot value 默认值_配置文件

@ConfigurationProperties 注值

1、使用 @ConfigurationProperties 注解,可以将 “application.yml” 配置文件中的键-值自动映射注入 Java Bean 中,属性必须提供 setter 方法。

2、如下演示为 POJO 对象属性注入值:

/**
 * Created by Administrator on 2018/7/11 0011.
 * 狗 实体类-----------普通Java Bean
 */
public class Dog {
    private Integer id;
    private String name;
    private Integer age;
 
   //被依赖项可以不加 @ConfigurationProperties 注解,但是必须提供 getter、setter、toString 方法
}
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * Created by Administrator on 2018/7/11 0011.
 * 用户···实体
 *
 * @ConfigurationProperties 表示 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 * prefix = "user" 表示 将配置文件中key为user的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中
 * 不存在"user"的key,则不会为POJO注入值,属性值仍然为默认值
 * <p/>
 * @ConfigurationProperties (prefix = "user") 默认从全局配置文件中获取值然后进行注入
 * @Component 将本类标识为一个Spring 组件,因为只有是容器中的组件,容器才会为@ConfigurationProperties提供此注入功能
 */
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    private Integer id;
//如果 lastName 属性名称改为"name"时,注入的时候会强制变成计算机名称,而导致自己的值无法注入(原因未知)
    private String lastName;
    private Integer age;
    private Date birthday;
    private List<String> colorList;
    private Map<String, String> cityMap;
    private Dog dog; //关联的 Dog 对象可以不加 @ConfigurationProperties 也会自动注入
 
   //必须提供 getter、setter 方法才能注入值
   //此处省略了,不做粘贴
}

3、写了上面的 “@ConfigurationProperties(prefix = “user”)” 注解后,如果提示 “Spring Boot配置文件注解处理器没有找到”, 这时可以点击右上角的提示 “Opne Documention…”,进入官方文档拷贝依赖放入到 “pom.xml” 文件中即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zerqTYX1-1596785113260)(42A9DB7B7A094A658DFDE6E66E48C205)]

4、拷贝粘贴如下,它的作业就是再写 yaml 文件时就会有提示了,会方便很多(当然没导入此依赖也是可以的)。

<!--导入配置文件处理器,配置文件属性值与Java Bean进行绑定时就会有提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

5、application. yml 文件内容如下,key 值 user 要与 User 实体类上的 “@ConfigurationProperties(prefix = “user”)” 对应,

配置文件中 user 下的 key 名称要与实体类 User 中的属性一致才能注入(下面基本涵盖了 YAML 所有的数据类型)。

server:
  port: 8080
user:
  id: 120
  lastName: 李四
  age: 110
  birthday: 2018/07/11
  colorList: #数组类型
    - red
    - yellow
    - green
  cityMap: {mapK1: mapV1,mapK2: mapV2}  #map类型
  #对象类型
  dog:
    id: 9527
    name: 哮天犬
    age: 100

对应的 .properties 文件格式如下:

server.port=8081

user.id=111
user.lastName=张无忌
user.age=120
user.birthday=2018/07/11
user.colorList=red,yellow,green,blacnk
user.cityMap.mapK1=mapV1
user.cityMap.mapK2=mapV2
user.dog.id=7523
user.dog.name=狗不理
user.dog.age=3

6、取值的时候注意:必须使用 @Resource、@Autowired 注入 User 对象才能获取到它注入的属性值,直接 new User() 对象是没有注入的默认值的。

@Resource
private User user;//这样才能获取到  @ConfigurationProperties 注入的值

乱码处理:*.properties 文件中含有中文时,IDEA 设置的 UTF-8 仍然会乱码,需要勾选后面的"本地编码转为ASCII码"即可解决
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAmIXKFu-1596785113261)(955A3B2D55A94BE5863BB774A624E7EC)]

"File Encodings"设置完成后,如果.properties文件中之前已经存在中文了,则需要删除重写

@Value 取值注入

1、@Value 与 @ConfigurationProperties 注解都可以从全局配置文件中获取值然后注入到属性中。

2、以前在 Spring 核心配置文件 beans.xml 中用如下配置为某个类的属性注入值。

<!--以前在Spring核心配置文件beans.xml用如下配置为某个类的属性注入值-->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="${jdbc.driverclass}"></property>
      <property name="url" value="${jdbc.url}"></property>
      <property name="username" value="root"></property>
      <property name="password" value="123456"></property>
 </bean>

3、现在直接使用 @Value (xxx) 注解就可以直接为某个属性注入全局配置文件中的值,完全等价于上面。

@Value(“#{}”):表示 SpEl 表达式。
@Value(“springBoot 接收实体的时候给字段设置默认值 springboot value 默认值_spring_02{xxx:yyy}”):从配置文件中取值,如果 “xxx” key 不存在,则使用默认值 “yyy”

4、假如有 application.yml 文件如下:

server:
   port: 8081
user:
   id: 110
   lastName: 张三
   age: 110
   birthday: 2018/07/11
   colorList:
     - red
     - yellow
     - green
   cityMap: {mapK1: mapV1,mapK2: mapV2}
   dog:
     id: 9527
     name: 哮天犬
     age: 100

5、@Value 获取全局配置文件 application.yml 中的值为属性赋值(被赋值的属性可以不提供 setter 方法,但是所在的类必须被 Spring 容器管理):

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * Created by Administrator on 2018/7/11 0011.
 * 狗 实体类
 * @Component 无论是@ConfigurationProperties还是@Value注入值,都必须先使当前类成为-
 * Spring容器中的组件,这样Spring容器才能为它DI注入值
 */
@Component
public class Dog {
    //赋值普通的Java数据类型值
    @Value("1000")
    private Integer id;
 
    //${key}:从环境变量以及配置文件中获取值,如果 user.lastName 不存在,则设置默认值 root
    @Value("${user.lastName:root}")
    private String name;
 
    //#{SpEL}:Sping 表达式语言
    @Value("#{10*3}")
    private Integer age;
}

@Value VS @ConfigurationProperties

对比项

@ConfigurationProperties

@Value

注解功能

将配置文件中的属性值批量注入类的各个属性

为类中的各个属性逐个赋值

松散绑定

支持

不支持

SpEL(Spring 表达式)

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

属性是否需要提供setter方法

需要

不需要

1、两者都可以从配置文件 *.yml 与 *.properties 中获取到值;

2、如果项目中只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value 即可;如果项目中专门编写了一个 JavaBean 来和配置文件进行映射,则直接使用 @ConfigurationProperties 即可;

3、Spring Boot 官方 org.springframework.boot.autoconfigure 包下的 XxxProperties 类都是使用 @ConfigurationProperties 注入属性值的,如:

springBoot 接收实体的时候给字段设置默认值 springboot value 默认值_spring boot_03

配置文件 ${xxx} 占位符

1、Spring Boot 全局配置文件“application.yml”与"application.properties" 可以使用 ${random} 来设置随机值

2、常用随机设值如下:

${random.value}------------随机生成一个32位的字符串,如:b21d56d2f10d74f84608dfff01b25552
${random.int}---------------随机生成一个int范围的随机数,如:-386223791
${random.long}-------------随机生成一个long范围的随机数,如:2404587442488649534
${random.int(10)}----------随机生一个[0,10]之间的随机数,如:8
${random.int[1024,65536]}-------随机生成一个[1024,65536]之间的随机数,如:63856
KaTeX parse error: Undefined control sequence: \- at position 16: {user.userName}\̲-̲\-\-\-\-\-\-\-\…{user.userName}”
${user.width:hello}-----------获取配置文件中已经配置好的属性值,不存在时则用"hello"返回

3、如下所示配置参数,然后可以使用 @ConfigurationProperties 、@Value 注解取值:

user.id=${random.int}
user.age=${random.long}
user.userName=张三_${random.uuid}
user.addr=深圳_${random.value}
user.city=长沙_${random.int(10)}
user.like=电影_${random.int[1024,65536]}
user.color=红色_${user.userName}
user.height=${user.width:hello}_身高