当前位置:   article > 正文

spring boot 配置文件_springboot指定配置文件

springboot指定配置文件

一、spring boot 配置文件

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

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

加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,
高优先级的内容会覆盖低优先级的内容,形成互补配置
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
源码:ConfigFileApplicationListener
  • 1

在这里插入图片描述
项目结构:
在这里插入图片描述
注意:当是多模块项目时,最外层的/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指定的默认属性
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
注:同一目录下,properties配置文件优先级 > yml/yaml配置文件优先级。
因此在jar包启动时如果带上properties写法的配置可以覆盖配置。
yaml/yml配置文件写法冒号后要加空格
  • 1
  • 2
  • 3

三、配置文件值的读取

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

@Value("${name}")
String name;
  • 1
  • 2

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

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

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

注:
@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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/953632
推荐阅读
相关标签
  

闽ICP备14008679号