SpringBoot配置文件详解

</br>

SpringBoot文件的配置

默认配置

SpringBoot有两种全局配置文件,可以对一些默认的配置进行修改,如数据库连接、日志设置、以及自定义属性的配置。

  1. application.properties

  2. application.yml

    程序启动的时候会默认加载配置文件,配置文件放在src/main/resources目录或者类路径/config下,配置文件的路径是有优先级的
    两种配置文件,只做关于yml简单介绍,更多的使用可自行在网络上进行搜索

    以下将以yml配置文件为例

基本配置

YML基本介绍官方地址

YAML (YAML Aint Markup Language)是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。

YAML基本语法规则

  1. 大小写敏感

  2. 使用缩进表示层级关系

  3. 缩进时不允许使用Tab键,只允许使用空格。

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

    1
    2
    3
    4
    5
    6
    7
    8
    server:
    port: 8080
    servlet:
    context-path: /
    tomcat:
    uri-encoding: UTF-8
    max-threads: 800
    min-spare-threads: 30

    此处对于yml不做过多的介绍,网络上有很多是资料YAML教程

    获取配置的方法

    在程序中通过@ConfigurationProperties和@Value注解获取属性,下面介绍这两种获取值的方式
    @ConfigurationProperties与@Value区别
    区别
    首先在application.yml配置文件中自定义一个属性
    application.yml配置文件中

    1
    2
    3
    com:
    name: "姓名"
    descriptive: "自定义"

@ConfigurationProperties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 /**
* ConfigurationProperties指定从配置文件中读取属性,prefix指定对应yaml文件中的key。
*/
@Component
@ConfigurationProperties(prefix="com")
public class CustomPropertiesConfig {
/**
* 姓名
*/
private String name;

/**
* 自定义
*/
private String descriptive;

省略get/set
}

通过@Autowired注解获得配置文件的类属性
@Autowired
CustomPropertiesConfig customPropertiesConfig;
获得配置文件中的值customPropertiesConfig.getName();

@Value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 通过@Value获取自定义的值
*/
@Component
public class CustomPropertiesValueConfig {
/**
* 姓名
*/
@Value("${com.name}")
private String name;
/**
* 自定义
*/
@Value("${com.descriptive}")
private String descriptive;
省略get/set
}

通过@Autowired注解获得配置文件的类属性@Autowired
CustomPropertiesValueConfig customPropertiesValueConfig;
customPropertiesValueConfig.getName();
{% note warning %} 如果所声明的类是一个组件,则需要在实体类上需要加上@Component 如果需要使用表达式只有@Value才可以,@Value("#{2*2}) 结果为:4 {% endnote %}
使用场景
{% note info no-icon %} 只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value; 编写了一个javaBean来和配置文件进行映射,使用@ConfigurationProperties; {% endnote %}

加载外部配置文件

如果将所有的配置信息全部写到一个配置文件中的话,如果配置东西过多,不便于维护,可以进行拆分,拆分到多个文件中,然后通过引用进行使用

  1. @PropertySource(value={“classpath:文件名称.properties”})
  2. @ImportResource(locations={“classpath:文件名称.xml”}
  3. @Configuration和@Bean方式

    @PropertySource

    @PropertySource(需要注入的类的前面使用该注解)

    1
    2
    3
    4
    5
    6
    7
    8
    @Component
    @ConfigurationProperties(prefix = "test")//这个不能注,注了就会报错
    @PropertySource(value ={"classpath:test.properties"}) //value的值可以是数组
    public class TestPropertiesConfig {
    private String name;
    private Integer age;
    省略get/set
    }

@ImportResource

@ImportResource(在主函数SpringBootApplication前面使用该注解)

@Configuration和@Bean方式

1
2
3
4
5
6
7
8
9
10
11
12
13
  /**
* 配置类
*/
@Configuration//指定这是一个配置类,用于替代之前的配置文件
public class AppConfig {

//将方法的返回值添加到容器中,容器中组件的id就是方法的返回值
@Bean
public MyService myService(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new MyService();
}
}
{% note warning %} 使用第三种方式的时候需要在主函数程序类中注释掉@ImportResource {% endnote %}

多环境切换

在项目开发中会遇到多个环境的切换,如开发环境、生成环境、测试环境,在主配置文件中通过

1
2
3
spring:
profiles:
active: dev #指定读取的文件

1. application.yml 主配置文件
2. application-dev.yml 开发环境
3. application-prod.yml 生产环境
4. application-test.yml 测试环境

在主配置文件中切换 active:后面的值来进行环境切换
java –jar xxx.jar –spring.profiles.active=dev

配置文件的加载顺序

前文说过 “配置文件放在src/main/resources目录或者类路径/config下,这个配置文件的路径是有优先级的。”

springboot启动的时候会扫描配置文件作为springboot的默认配置文件。

  1. 项目路径下的config文件夹 file:./config/ [需注意此路径下配置文件打成jar包时,不会出现在jar包中]

  2. 项目路径下 -file:./

  3. classpath路径下config文件夹-classpath:/config/

  4. classpath路径下 -classpath:/

    以上加载顺序是按照优先级从高到低的顺序,所有位置的文件都会被加载,如果冲突的情况,高优先级配置内容会覆盖低优先级配置内容。
    如果不冲突,形成互补配置(共同作用,一个文件没有另一个有的会一起都会产生作用)。
    可以通过配置spring.config.location来改变默认配置。使用命令行方式加载,否则优先级不够。
    项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置
    java -jar 项目名称.jar –spring.config.location=配置文件路径 (如D:/application.yml)

    外部配置加载顺序

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

  5. 命令行参数所有的配置都可以在命令行上进行指定(java -jar 项目名称..jar –server.port=8087 –server.context-path=/abc多个配置用空格分开; –配置项=值)

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

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

  8. 操作系统环境变量

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

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

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

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

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

  14. @Configuration注解类上的@PropertySource

  15. 通过SpringApplication.setDefaultProperties指定的默认属性
    所有支持的配置加载来源:官方参考文档

    结束

    以上内容除了外部配置加载顺序使用较少,其他都是在程序中经常使用的,每个都经过代码的验证,如有不对的地方或者待完善的地方,请多多指教。

-------------本文结束感谢您的阅读-------------