springboot的配置

一、yml基本语法与表达

1、yaml基本语法

1、k:(空格)v 表示键值对

key: value

2、利用缩进表示层级关系

key:
	child-key1: value1
	child-key2: value2

3、属性和值大小写敏感
4、注释
使用#进行注释

#xxxxxxx
key: value

2、值的表达

1、对象

Student:
	name: tom
	age: 11
#行内写法
Student: {
    
    name:tom,age:11}

2、数组

nums: 
	- 1
	- 2
	- 3
#行内写法
nums: {
    
    1,2,3}

二、springboot配置文件

在写之前可以先导入配置文件处理器,这样在编写yml时就会有提示了

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

1、配置文件值的注入

前提:必须将该配置文件所对应的javabean放在IOC容器中,即使用@Component注解

方式1
使用@ConfigurationProperties(prefix = “person”)设一个用于绑定的值,在配置文件中通过这个绑定值,来设置该类其中的属性。

javabean

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    
    
    private String lastName;
    private Integer age;
    private boolean boss;
    private Date date;

    private Map<String,Object> maps;
    private List<Object> list;
    private Dog dog;
    ....
}
@Component
public class Dog {
    
    
    private String name;
    private Integer age;
    ...
}

yml配置文件

person:
  lastname: zhangsan
  age: 11
  boss: true
  date: 2010/11/11
  maps: {
    
    k1: v1,k2: v2}
  list:
    - list1
    - list2
    - list3
  dog:
    name: xiaoming
    age: 2

结果:

Person{lastName='zhangsan', age=11, boss=true, date=Thu Nov 11 00:00:00 CST 2010, maps={k1=v1, k2=v2, kw=v2}, list=[list1, list2, list3], dog=Dog{name='xiaoming', age=2}}

方式二
可以通过使用@PropertySource指定properties配置文件将其中的值赋给该对象

配置文件

person.last-name=张三
person.age=11
person.boss=false
person.date=2021/2/2
person.maps.k1=v1
person.maps.kw=v2
person.list=a,x,c,v
person.dog.name = dog
person.dog.age = 15

javabean

/**
 * 将配置文件中的每一个属性的值映射到这个组件中
 * @ConfigurationProperties 高数springboot将本类中所有属性和配置文件中相关的配置进行绑定
 *      prefix 在配置文件中哪个下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件,才能提供@ConfigurationProperties的功能
 *
 * @PropertySource 导入spring的配置文件,让配置文件中的内容生效
 */
@PropertySource(value = {
    
    "classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    
    
    private String lastName;
    private Integer age;
    private boolean boss;
    private Date date;

    private Map<String,Object> maps;
    private List<Object> list;
    private Dog dog;
    ...
}

结果

Person{lastName='张三', age=11, boss=false, date=Tue Feb 02 00:00:00 CST 2021, maps={k1=v1, kw=v2}, list=[a, x, c, v], dog=Dog{name='dog', age=15}}

方式三
使用@Value注解为属性赋值

@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
    
    

    @Value("zhangsan")
    private String lastName;
    @Value("11")
    private Integer age;
    private boolean boss;
    private Date date;

    private Map<String,Object> maps;
    private List<Object> list;
    private Dog dog;

结果

Person{lastName='zhangsan', age=11, boss=false, date=null, maps=null, list=null, dog=null}

2、@Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

3、配置文件注入数据校验

在使用校验之前需要先导入字段校验的依赖

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>

先用@Validated注解修饰要校验的类,然后用一下的注解修饰该类中要校验的属性

借鉴

@AssertFalse 校验false
@AssertTrue 校验true
@Email 校验是否是邮箱格式
@DecimalMax(value=,inclusive=) 小于等于value,
inclusive=true,是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull  检查Null
@Past  检查日期
@Pattern(regex=,flag=)  正则
@Size(min=, max=)  字符串,集合,map限制大小
@Validate 对po实体类进行校验

使用方式三的配置文件注入

@PropertySource(value = {
    
    "classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    
    

//    @Value("zhangsan")
    @Email
    private String lastName;
//    @Value("11")
    private Integer age;
    private boolean boss;
    private Date date;

    private Map<String,Object> maps;
    private List<Object> list;
    private Dog dog;
	...
}

结果:

java.lang.IllegalStateException: Failed to load ApplicationContext

4、配置文件占位符

#配置person的值
#配置文件的占位符${},如果想设没有的默认值可以用${name:defualt}
#通过使用${random.xxxx}随机数 例${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}等等
person.last-name=张三${random.int}
person.age=11
person.boss=false
person.date=2021/2/2
person.maps.k1=v1
person.maps.kw=v2
person.list=a,x,c,v
person.dog.name = ${person.hello:hello}dog
person.dog.age = 15

结果

//结果1
Person{lastName='张三-1155973093', age=11, boss=false, date=Tue Feb 02 00:00:00 CST 2021, maps={k1=v1, kw=v2}, list=[a, x, c, v], dog=Dog{name='hellodog', age=15}}
//结果2
Person{lastName='张三1191295749', age=11, boss=false, date=Tue Feb 02 00:00:00 CST 2021, maps={k1=v1, kw=v2}, list=[a, x, c, v], dog=Dog{name='hellodog', age=15}}

5、多Profile文件

1、多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
默认使用application.properties的配置;
在这里插入图片描述
application.properties文件

#激活使用application-dev.properties配置文件
spring.profiles.active=dev

application-dev.properties文件

#使用application-{profile},properties/yml取配置文件名
#默认使用的是application.properties
server.port=8081

application-prod.properties文件

server.port=8082

结果
在这里插入图片描述

2、yml支持多文档块方式

#yml支持多文档块方式用 --- 来分割文档块
server:
  port: 8080
spring:
  profiles:
    active: prod
---
server:
  port: 8081
spring:
  profiles: dev #制定属于那个环境
---
server:
  port: 8082
spring:
  profiles: prod
---

结果
在这里插入图片描述

6、配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

file:./config/

file:./

classpath:/config/

classpath:/

优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载主配置文件;互补配置

在这里插入图片描述
还可以通过spring.config.location来改变默认的配置文件位置

7、外部配置加载顺序

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

1.命令行参数

所有的配置都可以在命令行上进行指定

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

多个配置用空格分开; --配置项=值

2.来自java:comp/env的JNDI属性

3.Java系统属性(System.getProperties())

4.操作系统环境变量

5.RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找;

优先加载带profile

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

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

再来加载不带profile

8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件

9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件

10.@Configuration注解类上的@PropertySource

11.通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置加载来源;

参考官方文档

猜你喜欢

转载自blog.csdn.net/magicproblem/article/details/110132841