SpringBoot--配置文件

  • 1. SpringBoot配置文件简介
  • 2. YAML语法简单描述
  • 3. 配置文件多种注入方法
  • 4. 注解分析@PropertySource&@ImportResource&@Bean
  • 6. Profile文件详解
  • 6. 配置文件加载位置
  • 7. 外部配置加载顺序
  • 8. Github源码地址


1. SpringBoot配置文件简介

配置文件的作用:修改SpringBoot自动配置的默认值;共分文两类

  1. application.properties
  2. application.yaml

application.properties格式

server.port=8088

现在使用application.yaml格式

server:
  port: 8081

以前使用XML

<server>
	<port>8088</port>
</server>

2. YAML语法简单描述

  1. Key:[空格]Value:表示一对键值对(空格必须有);
  2. 只要是左对齐的一列数据,都是同一个层级的。
  3. 属性和值也是大小写敏感。
  4. 下例:服务的端口号
server:
  port: 8088

3. 配置文件多种注入方法

  1. 使用注解进行批量导入@ConfigurationProperties
  2. @Component和@ConfigurationProperties一起使用
  3. 只有这个组件时容器的组件,才能使用容器提供的@ConfigurationProperties功能

导入关键的配置依赖

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

定义一个实体类Person

/**
 * @ConfigurationProperties: 告诉SpringBoot将Spring中的所有属性和配置文件相关的配置进行绑定
 *  prefix = "person"  配置文件中哪个下面的属性进行一一映射
 *  只有这个组件时容器的组件,才能使用容器提供的@ConfigurationProperties功能
 *  @ConfigurationProperties  默认从全局配置文件中获取值
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

Dog简单实体类

public class Dog {
    private String name;
    private  Integer age;
   }

创建application.yaml文件

server:
  port: 8088

person:
  name: 戏子
  age: 18
  happy: true
  birth: 2000/1/3
  maps: {k1: 戏子,k2: 20}
  lists:
    - 国庆节
    - 中秋节
  dog:
    name: 旺财
    age: 5

测试效果

/**
 * SpringBoot单元测试
 * 可以在测试期间方便进行自动注入等容器
 *
 */

@SpringBootTest
class Springboot02ConfigApplicationTests {

    @Autowired
    private Dog dog;

    @Autowired
    private Person person;

    @Autowired
    ApplicationContext ioc;

    @Test
    void testPerson() {
        System.out.println(person);
    }

    @Test
    void testDog(){
        System.out.println(dog);
    }

linux springboot启动修改进程名称 springboot修改jar配置文件_java

注释 application.yaml 测试properties 格式

application.properties配置文件

占位符
server.port=8088
person.name=戏子66 ${random.uuid}
person.age=19
person.birth=2000/1/3
person.happy=false
person.maps.k1=戏子1
person.maps.k2=戏子2
person.lists=a,b,c
#person.dog.name=${person.name}_dog
#如果没有值,使用默认值
person.dog.name=${person.name22: xizi}_dog
person.dog.age=1

linux springboot启动修改进程名称 springboot修改jar配置文件_加载_02

当同时使用yaml和properties时,yaml优先运行

优先级:加载顺序是yml>yaml>properties

查看源码

linux springboot启动修改进程名称 springboot修改jar配置文件_加载_03



配置文件的占位符

1. 随机数
${random.uuid}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2. 占位符获取之前配置的值,如果没有可以是用:指定默认值
application.properties 文件中已使用,测试结果已有

使用@Value注解逐个导入

这里用Dog实例说明 @Value各种属性测试

@Component
@Validated  //校验注解
//@ConfigurationProperties  //支持JSP303校验
public class Dog {

    @Email  //必须时邮箱格式
    @Value("${person.dog.name}")
//    @Value("旺财")
    private String name;
//    @Value("3")
    @Value("#{11*2}")  //支持SpEL
    private  Integer age;

测试

//在SpringBoot单元测试里添加方法
 @Test
    void testDog(){
        System.out.println(dog);
    }

linux springboot启动修改进程名称 springboot修改jar配置文件_配置文件_04

测试邮箱校验 @Value不支持JSP303校验

@ConfigurationProperties 支持校验

linux springboot启动修改进程名称 springboot修改jar配置文件_spring boot_05


@Configuration和@Value 两个注入的总结

Name |@Configuration| @Value

  • | :-: | -:
    功能 | 批量注入配置文件中的属性| 一个个指定
    SpEL | 不支持 | 支持
    JSR303数据校验 | 支持 |不支持
    复杂类型封装 |支持 |不支持


4. 注解分析@PropertySource&@ImportResource&@Bean

@PropertySource

@PropertySource:加载指定的配置文件;

创建一个配置文件 xizi.properties

#spring Booot 里面没有Spring的配置文件,自己编写的配置文件不能自动识别
#使用@ImportResource注解  加载配置文件 生效 标注在配置类上
person.name=xizi777
person.age=19
person.birth=2000/1/3
person.happy=false
person.maps.k1=xizi1
person.maps.k2=xizi2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=1

测试结果

linux springboot启动修改进程名称 springboot修改jar配置文件_spring_06

@ImportResource 在运行类上加注解

创建一个beas.xml 文件 注入Service层的HelloService类

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloService" class="com.xizi.service.HelloService">

    </bean>

</beans>

SpringBoot单元测试 查看注入的bean是否成功

@Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService(){
        boolean helloService = ioc.containsBean("helloService");
        System.out.println(helloService);
    }

linux springboot启动修改进程名称 springboot修改jar配置文件_配置文件_07


@Bean SpringBoot官方推荐使用的配置

创建自定义的configuration类 注释@ImportResource注解

package com.xizi.config;

import com.xizi.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration: 指明当前类是一个配置类,代替之前的Spring配置文件
 * 在配置文件中使用<bean></bean> 标签添加组件
 * */

@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中
    //组件中默认的id就是方法名
    @Bean
    public HelloService helloService(){
            return  new HelloService();
    }
}

测试

linux springboot启动修改进程名称 springboot修改jar配置文件_spring_08

6. Profile文件详解

配置的文件名可以是 application-[profile].properties/yaml
默认使用application.properties的配置;

  1. 第一种application.properties里修改,创建多个配置文件
  1. 创建一个dev和prod 环境配置文件 改变端口号
  2. 使用spring.profiles.active 激活其他配置文件
  3. 不激活,默认使用application.properties文件配置
  4. 测试我就不放了

linux springboot启动修改进程名称 springboot修改jar配置文件_java_09

  1. 第二种使用yaml文档块的模式 进行多文件配置
#使用yaml文档块的模式  进行多文件配置
server:
  port: 8088
spring:
  profiles:
    active: prod
---
server:
  port: 8083
spring:
  profiles: dev
---
server:
  port: 8084
spring:
  profiles: prod

激活指定的profile

  1. 在配置文件中指定 spring.profiles.active=dev
  2. 将项目打包,使用终端命令进行运行 加上参数
    java -jar XXX.jar --spring.profiles.active=dev;
  3. 虚拟机参数;
    -Dspring.profiles.active=dev
  4. Program arguments: --spring.profiles.active=dev

测试虚拟机参数

linux springboot启动修改进程名称 springboot修改jar配置文件_spring boot_10

6. 配置文件加载位置

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

  1. –file:./config/
  2. –file:./
  3. –classpath:/config/
  4. –classpath:/

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

测试优先级 1234从高到底加载端口号测试

linux springboot启动修改进程名称 springboot修改jar配置文件_加载_11


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

在优先级最低的application.properties加入项目访问路径名

server.port=8081

#SpringBoot在2.0版本之后已经弃用server.context-path
server.servlet.context-path=/boot002

linux springboot启动修改进程名称 springboot修改jar配置文件_java_12


我们还可以通过spring.config.location来改变默认的配置文件位置

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;

在D盘下面创建一个application.properties的配置文件 编写server.port=8090

java -jar springboot-config-test-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

直接在IDEA中打开终端命令行

linux springboot启动修改进程名称 springboot修改jar配置文件_java_13

7. 外部配置加载顺序

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

  1. 命令行参数:所有的配置都可以在命令行上进行指定
    多个配置用空格分开; --配置项=值
  2. linux springboot启动修改进程名称 springboot修改jar配置文件_加载_14


  3. 多个参数的运行
  4. linux springboot启动修改进程名称 springboot修改jar配置文件_spring boot_15


  5. 来自java:comp/env的JNDI属性
  6. Java系统属性(System.getProperties())
  7. 操作系统环境变量
  8. RandomValuePropertySource配置的random.*属性值

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

优先加载带profile

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

再来加载不带profile

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

测试 一个jar外部的appliction.properties配置文件

linux springboot启动修改进程名称 springboot修改jar配置文件_java_16