spring boot 配置文件

本文详细介绍了SpringBoot配置文件的加载顺序和优先级,从命令行参数到@PropertySource注解,逐一解析。重点讲述了配置文件的位置、@ConfigurationProperties的使用以及如何从自定义配置文件中读取值。同时提到了@ImportResource注解在加载XML配置文件中的作用。
摘要由CSDN通过智能技术生成

一、spring boot 配置文件

Spring Boot配置文件优先级加载机制

SpringBoot项目启动会扫描以下位置的application.properties或者application.yml作为默认的配置文件.
file:./config/
file:./config/*/
file:./
classpath:/config/
classpath:/

加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,
高优先级的内容会覆盖低优先级的内容,形成互补配置
源码:ConfigFileApplicationListener

在这里插入图片描述
项目结构:
在这里插入图片描述
注意:当是多模块项目时,最外层的/config文件夹下的配置,在打包时,功能模块并不会用到,而是用模块内的配置文件,一般情况下,类似微服务的多模块,每个模块都有对应的配置文件,并且配置文件放在模块的/resource文件下。这种/config最高优先级的一般是适用单体项目

二、springboot项目启动配置文件生效顺序(从高到低)

1、命令行参数
如:java -jar XXXX-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
2、来自java:comp/env的JNDI属性
3、Java系统属性(System.getProperties())
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值
备注:由jar包外向jar包内进行寻找,优先加载带profile的,再加载不带profile的
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
12、通过SpringApplication.setDefaultProperties指定的默认属性
注:同一目录下,properties配置文件优先级 > yml/yaml配置文件优先级。
因此在jar包启动时如果带上properties写法的配置可以覆盖配置。
yaml/yml配置文件写法冒号后要加空格

三、配置文件值的读取

方式一、通过@value读取比较简单的配置信息

@Value("${name}")
String name;

方式二、通过@ConfigurationProperties读取并与 bean 绑定

@Component
@ConfigurationProperties(prefix = "redis") // 
class RedisConfig {
    private String host; // 属性名称跟application.yml中定义的一致
    private String port;
}
注: 该注解用于从配置文件中取值,支持复杂的数据类型,但是不支持SPEL表达式。
prefix属性:指定获配置的前缀,毕竟配置文件中的属性很多,也有很多重名的,必须用一个前缀来区分下。
该注解可以标注在类上也可以标注在方法上,这里就可以看出它有两种获取值的方式。

注:@ConfigurationProperties这个注解仅仅是支持从SpringBoot的默认配置文件中取值,也就是application.properties、application.yml、application.yaml,那我们如何从自定义配置文件取值呢???
别着急,有解决办法,那就是再加一个注解:@PropertySource(value=“classpath:custom-profile.properties”),

@PropertySource注解,读取指定 properties 文件

@Component
@PropertySource("classpath:website.properties")
@Data
class WebSite {
    @Value("${url}")
    private String url;
}
有时候为了避免application.yml的配置过于臃肿,可以适用@PropertySource加载指定的配置文件
@Component
@PropertySource("classpath:custom.properties")
@Data
class WebSite {
    @Value("${url}")
    private String url;
}
注:
@PropertySource注解属性
value:是一个数组,可以指定多个配置文件同时引入。
value是数组那么问题就来了:如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。

注:
@PropertySource默认加载xxx.properties类型的配置文件,不能加载YML格式的配置文件,要加载yaml配置,需指定factory属性来加载YML格式的配置文件。同时加载多个配置

扩展

SpringBoot还提供了@ImportResource注解加载外部配置文件,
只不过@ImportResource通常用于加载Spring的xml配置文件
@ImportResource使用
SpringBoot提出零xml的配置,因此SpringBoot默认情况下是不会主动识别项目中Spring的xml配置文件。
为了能够加载xml的配置文件,Spring Boot提供了@ImportResource注解,
该注解可以加载Spring的xml配置文件,通常加于启动类上


@SpringBootApplication
@ImportResource(value = {"classpath:config/beans.xml"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值