一、配置文件

Spring boot 使用一个全局配置文件,配置文件名,固定为 application.properties 或 application.yml。

通过配置文件修改springboot的配置的默认值,springboot在底层都给我们自动配置好。

YAML(YAML Ain‘t Markup Language)

YAML A Markup Language:是一个标记语言。

YAML isn't Markup Language:不是一个标记语言。

application.properties:

server.port=8080

application.yml:

server:
  port: 8090

二、yml语法格式

(一)基本语法

k:(空格)v:表示一对键值对(空格必须有)。

server:
  port: 8090
  path: /hello

使用缩进表示层级关系。

缩进时不允许使用tab键,只允许使用空格。

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

大小写敏感。

(二)支持的三种数据结构

  • 字面量:单个的、不可再分的值(数字、字符串、布尔)。

      字符串默认不用加上单引号或双引号。

      “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

name: "zhangsan \n lisi" 
#表示 zhangsan 换行 lisi

  '':单引号;会转义字符串里面的特殊字符;特殊字符最终只是一个普通的字符串数据

name: "zhangsan \n lisi" 
#表示 zhangsan \n lisi
  • 对象:键值对的集合。

k:v写法:

friends:
    lastName: zhangsan
    age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}
  • 数组:一组按次序排列的值(List、Set)。

用-值表示数组中的一个元素 

pets:
  - cat
  - dog
  - pig

行内写法: 

pets: [cat,dog,pig]

(三)配置文件读取

Person类:

package com.roger.springboot02configure.bean;

import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @ConfigurationProperties 告诉Springboot将本类中的所有属性和配置文件中相关的配置进行绑定;
 * prefix = "person":配置文件中哪个下面中的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 */
@Data
@Component
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {
    /**
     * 使用value方式的进行读取
     * @Value("${person.lastName}")
     */
    private String lastName;
   /* SpEL表达式
   @Value("#{11*2}")*/
    private Integer age;
    /**
     * 必须以email的邮箱格式
     */
    @Email
    private String email;
    /*@Value("${true}")*/
    private Boolean boss;
   /* @Value("${person.birth}")*/
    private Date birth;

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

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

Dog类: 

package com.roger.springboot02configure.bean;

import lombok.Data;

@Data
public class Dog {
    private String name;
    private Integer age;

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

yml配置文件:

server:
  port: 8090

person:
  lastName: zhangsan
  #另一种写法
  ###last-name: zhangsan
  age: 18
  email: test@qq.com
  boss: false
  birth: 2018/12/12
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - zhaoliu
    - lanlan
  dog:
    name: xiaogou
    age: 2

properties配置写法:

server.port=8080

#idea默认utf-8编码
#如果使用properties进行配置,则需要在idea中进行编码设置。
person.last_name=张行
person.age=18
person.email=test@qq.com
person.boss=false
person.birth=2018/12/12
person.maps.k1=v1
person.maps.k2=v2
person.lists=lisi,zhaoliu,lanlan
person.dog.name=xiaogou
person.dog.age=2

如果使用properties进行配置,则需要在idea中进行编码设置。 

springboot 最新spi_springboot 最新spi

test类:

package com.roger.springboot02configure;

import com.roger.springboot02configure.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringBoot02ConfigureApplicationTests {

	@Autowired
	Person person;
	@Test
	void contextLoads() {
		System.out.println(person);
	}

}

测试结果:

springboot 最新spi_spring_02

 (四)@Value获取值和@ConfigurationProperties获取值的比较

 

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

person.lastName/person.last-Name/person.last_name

不支持

SpEl表达式

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

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

如果专门编写一个javaBean来获取配置文件的值,使用@ConfigurationProperties

@ConfigurationProperties

与@Bean结合为属性赋值

与@ProperySource(只能用于properties文件)结合读取指定文件

(五)@ProperySource

加载指定配置文件

@Data
@Component
@Validated
/**
*加载person.properties配置文件的内容。
*/
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
    /**
     * 使用value方式的进行读取
     * @Value("${person.lastName}")
     */
    private String lastName;

(六)@ImportResource

导入Spring组件配置文件,让配置文件里面的内容生效

Spring boot 里面没有Spring配置文件,如果想让编写的配置文件生效,需要用@ImportResource标注在一个配置类上进行加载。

新建beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="helloService" class="com.roger.springboot02configure.service.HelloService"></bean>

</beans>

新建service.Helloservice类

package com.roger.springboot02configure.service;

public class HelloService {
}

在Application种增加@ImportResouce语句

package com.roger.springboot02configure;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

//导入spring配置文件
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBoot02ConfigureApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBoot02ConfigureApplication.class, args);
	}

}

编写测试方法 

@Autowired
	ApplicationContext ioc;
	@Test
	public void testHelloService(){
		Boolean b = ioc.containsBean("helloService");
		System.out.println("helloService 是否存在:"+b);
	}

(七)@Bean

Spring boot推荐给容器中添加组件的方式(全注解的方式)

配置类

package com.roger.springboot02configure.config;

import com.roger.springboot02configure.service.BeanService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration 指明当前类是一个配置类,就是来替代之前的Spring配置文件
 * 在配置文件种用<bean></bean>标签添加组件
 */
@Configuration
public class MyAppConfig {

    @Bean
    public BeanService beanService(){
        return new BeanService();
    }

}

测试方法

/**
	 * spring boot 推荐的方式
	 * 用@Configuration
	 * 替代@ImportSource + bean.xml
	 */
	@Test
	public void testTestService(){
		Boolean b = ioc.containsBean("beanService");
		System.out.println("beanService 是否存在:"+b);
	}

(八)配置文件占位符

1.RandomValuePropertySource:配置文件中可以使用随机数

${random.value} 、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65535}

2.属性配置占位符

app.name=myApp
app.description=#{app.name} is a Spring Boot Application

可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)

${app.name:默认值}来指定找不到属性时的默认值

#idea默认utf-8编码
#如果使用properties进行配置,则需要在idea中进行编码设置。
person.lastName=李四${random.uuid}
person.age=${random.int}
#person.email=test@qq.com
#person.boss=false
person.birth=2018/12/12
person.maps.k1=v1
person.maps.k2=v2
person.lists=lisi,zhaoliu,lanlan
person.dog.name=${person.lastName}'s dog
#默认值
#person.dog.name=${person.lastName:default}'s dog
person.dog.age=2

(九)多环境支持

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。

1.多profile文件形式

-格式:application-{profile}.properties

application-dev.properties、application-prod.properties

2.多profile文档块模式

Spring:
  profile:
    active: prod  ##激活prod配置文件

## --- 表示一个文档块,相当于多个配置文件
---
spring:
  profiles: prod
server:
  prot: 80

---
spring:
  profiles: default
server:
  prot: 8080


---
spring:
  profiles:dev
server:
  prot: 8081

3.激活方式

-命令行:  --spring.profiles.active=dev

-配置文件:spring.profiles.active=dev

-jvm参数:-Dspring.profiles.active=dev

(十)配置文件加载位置

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

1.file:./config/

2.file:./

3.classpath:./config/

4.classpath:./

以上是按优先级从高到低的顺序,所有位置的文件都会被加载(互补配置),高优先级配置内容会覆盖低优先级配置内容。

项目发布时,我们也可以通过命令行参数的形式,通过配置spring.config.location来改变默认配置

java -jar springboot-hello.jar --spring.config.location=d:/application.properties

同时有 application.yml 、application.properties、用户指定.properties时的优先级yml最高,properties文件第二。

(十一)外包配置加载顺序

1.命令行参数

java -jar springboot.jar --server.port=8082

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

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

4.操作系统环境变量

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

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

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

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

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

10.@Configuration注解类的@propertySource

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

(十二)@Conditional

@Confitional 指定的条件成立,才给容器中添加组件,配置里面的所有内容才生效。

通过debug=true,带你自动匹配报告,可以查看哪些自动配置类已经生效,哪些未生效。

springboot 最新spi_spring_03