springboot2.0 配置文件application.properties,application.yml语法详解

创建一个springboot项目《spring boot2.0 第一个程序《快速开始》》

SpringBoot使用一个全局的配置文件,配置文件名是固定的;

application.properties

application.yml

配置文件的主要作用

修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好的一些默认属性

自定义一些属性,并且注入的spring的容器中

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

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

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

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

加载文件顺序,可以看到,文件可以存放在项目外部,可以项目内部(classpath下),外部的优先级别要高于内部的

外部的文件的优先级别可以参考官网的文档https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-external-config

 

我们来看下yml的语法:先定义一个实体对象

public class Emp {
    private String name;

    private Integer age;

    private List<String> list;

    private Map<String, String> map;
    //免去get 和set方法
}

yml文件的语法:属性和值也是大小写敏感 ,属性与属性之间,需要换行空2格

emp: 
   #普通的类的数据 使用key: val
   name: xiaoli
   age: 18
   #集合的形式 行内写法 list: [xiaoming,xiaohong]
   list: 
    - xiaoming
    - xiaohong
   #map 或者对象的写法  行内写法 map: {test01:test01,test02:test02} 
   map: 
    test01: test01
    test02: test02 

1:字面量:普通的值(数字,字符串,布尔)

使用 字段:(空格)值

注意:字符串默认不用加上单引号或者双引号;

"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思 (例如:xiaoli \n,表示xiaoli 换行)

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

2:对象、Map(属性和值)(键值对):

对象下,还是使用 字段:(空格)值

3:数组(List、Set):

list: 
    - xiaoming
    - xiaohong
list: [xiaoming,xiaohong]

字段:

    横杠(空格)值

4:还可以使用${}符号,引用已经配置过的属性(包括默认配置以及自定义的配置)

emp:
  name: xiaoli
  age: 18
  list:
  ##如果${emp.age}没有值,可以使用${emp.age:19}来指定默认值
  - ${emp.age}xiaoming
  - xiaohong
  map:
    test01: test01
    test02: test02

5:也可以使用系统定义的一些函数

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

 

最后把属性注入到这个对象中,使用 @ConfigurationProperties(prefix = "emp")注解,标注在实体类上,并@Component 加入到容器中

@Component
@ConfigurationProperties(prefix = "emp")
public class Emp {
    private String name;

    private Integer age;

    private List<String> list;

    private Map<String, String> map;
    //免去get和set方法
}

另外,在之前的《spring 注解@PropertySource 引入文件,@Value读取文件内容,EmbeddedValueResolverAware读取文件内容》中,也可以使用@Value注解,来注入属性的值,当然,两者之间还是有区别的

    @Value获取值和@ConfigurationProperties获取值比较

 @ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持(userName或者user-name)不支持
SpEL不支持支持
JSR303数据校验支持(@Validated注解的支持)不支持
复杂类型封装支持(支持各种嵌套类型,复杂类型)不支持

上述的yml用法,在application.properties中的用法如下:

emp.age=18
emp.list=xiaohong,xiaolan
emp.map.k1=k1
emp.map.k2=k2
##集合的另一种写法,yml文件,也是支持的
emp.list[0] = xioali
emp.list[1] = xioali

 

更加的详细的,就不介绍了,大家在实际应用中,再发现和探究吧

 

<think>首先,用户的问题是:“我想判断SpringBootapplication.ymlapplication.properties的优先级关系请问SpringBootapplication.yml优先级高于application.properties吗”我需要基于系统指令来回答:1.**行内数学表达式**:使用$...$格式。但这个问题是关于SpringBoot配置的,没有数学内容,所以可能不需要数学表达式。如果有变量或技术术语,可以适当使用,但这里主要是文本。2.**独立公式**:必须使用$$...$$格式并单独成段。同样,这里可能不需要。3.**LaTeX语法正确**:确保任何LaTeX使用正确。4.**使用中文回答**:整个回答必须用中文。5.**生成相关问题**:在回答末尾生成相关问题,用“§§相关问题§§”标识。6.**引用的段落末尾自然地添加引用标识**:例如[^1]。引用来自提供的引用内容。提供的引用:-[^1]:优先级关系:SpringBoot先加载application.properties,然后加载application.yml。如果有相同配置项,application.yml覆盖application.properties。-[^2]:SpringBoot可以有多个配置文件。-[^3]:优先级:application.yml的搜索优先级低于application.properties。-[^4]:优先级顺序:命令行参数>JAR包外的application-{profile}.properties>JAR包内的application-{profile}.properties>JAR包外的application.properties>JAR包内的application.properties。用户的问题核心是:application.yml的优先级是否高于application.properties?从引用中:-[^1]说:加载顺序是先.properties.yml,且.yml覆盖.properties,意味着.yml优先级更高。-[^3]说:application.yml的优先级低于application.properties(“searchprecedenceimmediatelylowerthan”),这与[^1]矛盾。我需要解决这个矛盾。回忆SpringBoot文档:SpringBoot加载配置文件的顺序是:application.propertiesapplication.yml之前加载,但如果有相同属性,后加载的覆盖先加载的。所以,application.yml会覆盖application.properties,因为它在之后加载。标准顺序:SpringBoot使用特定的PropertySource顺序。application.propertiesapplication.yml都在classpath根目录下时,application.properties先加载,然后application.yml加载,因此application.yml的值覆盖application.properties的值。从[^4]:优先级顺序是:-命令行参数-JAR包外的application-{profile}.properties-JAR包内的application-{profile}.properties-JAR包外的application.properties-JAR包内的application.properties但这里没有提到.yml。在SpringBoot中,.yml文件被视为YAML配置文件,优先级类似于.properties文件。在SpringBoot2.x,配置文件的加载顺序是:-命令行参数-来自java:comp/env的JNDI属性-Java系统属性(System.getProperties())-操作系统环境变量-RandomValuePropertySource-打包jar之外的application-{profile}.properties.yml-打包jar之内的application-{profile}.properties.yml-打包jar之外的application.properties.yml-打包jar之内的application.properties.yml对于相同类型的文件,.properties.yml在同一个位置时,.properties文件先加载,然后.yml文件加载。因此,如果两者都存在,application.properties加载后application.yml加载,yml覆盖properties。所以,application.yml的优先级更高,因为它覆盖properties。从引用[^1]:它明确说application.yml覆盖application.properties。[^3]说:“searchprecedenceimmediatelylowerthan”,这可能是个误解。在上下文中,它可能意味着在列表中优先级较低,但实际覆盖行为是后加载的覆盖先加载的。在SpringBoot源码中,YamlPropertySourceLoader加载.yml文件,而PropertiesPropertySourceLoader加载.properties文件。它们在PropertySource顺序中按文件位置排序。在标准配置中,对于classpath根目录的文件,application.properties优先级较高(加载较早),但值被后加载的覆盖。所以,回答用户:application.yml的优先级高于application.properties,因为它会覆盖后者。结构化回答:1.**清晰结构**:逐步解释优先级关系。2.**参考引用**:自然地添加引用标识。3.**使用中文**。4.**生成相关问题**。回答大纲:-直接回答问题:是的,application.yml的优先级高于application.properties。-解释原因:基于加载顺序和覆盖行为。-引用支持:[^1]和[^4]。-生成相关问题。最终回答:-开头:直接回应问题。-中间:详细解释。-结尾:相关问题。生成相关问题:1.关于配置文件的其他方面。例如:1.SpringBoot中如何自定义配置文件路径?2.什么是profile-specific配置文件?3.如何设置环境变量覆盖配置文件?基于引用。</think>### Spring Boot中application.ymlapplication.properties的优先级关系 在Spring Boot中,配置文件的优先级关系是一个关键概念,它决定了当多个配置文件存在时,哪些配置值会被最终应用。针对您的疑问:“Spring Boot application.yml优先级高于application.properties吗?”答案是:**是的,application.yml的优先级高于application.properties**。但这不是绝对的优先级顺序,而是基于Spring Boot的配置加载机制。下面我将逐步解释这一关系,确保回答清晰可靠。 #### 优先级机制详解 1. **加载顺序**: - Spring Boot在启动时,会按照特定的顺序加载配置文件。默认情况下,它会先加载`application.properties`文件,然后再加载`application.yml`文件[^1]。 - 例如,如果两个文件都位于项目的`src/main/resources`目录下(即classpath根目录),Spring Boot会先读取`application.properties`中的配置,再读取`application.yml`中的配置。 2. **覆盖行为**: - 如果`application.properties`和`application.yml`中存在相同的配置项(例如`server.port=8080`在.properties文件中,而`server.port: 8181`在.yml文件中),那么后加载的`application.yml`会覆盖先加载的`application.properties`的值[^1]。 - 这是因为Spring Boot的配置系统采用“后加载者优先”的原则:后加载的配置源会覆盖先加载的相同属性。因此,`application.yml`的配置值会生效,表现出更高的优先级。 3. **整体优先级上下文**: - 需要注意的是,`application.yml`和`application.properties`的优先级不是孤立的,它们嵌入在Spring Boot的整个配置层次中。完整的优先级顺序(从高到低)如下[^4]: - 命令行参数(例如`--server.port=9090`) - JAR包外部的`application-{profile}.properties`或`application-{profile}.yml`(基于激活的profile) - JAR包内部的`application-{profile}.properties`或`application-{profile}.yml` - JAR包外部的`application.properties`或`application.yml` - JAR包内部的`application.properties`或`application.yml` - 默认配置(如通过`@PropertySource`注解加载的) - 在这个顺序中,`application.yml`和`application.properties`属于同一层级(JAR包内部或外部的通用配置),但具体到文件类型,`.yml`文件加载后会覆盖`.properties`文件的相同属性[^1][^3]。 #### 为什么会有误解? - 有时引用中提到`application.yml`的“搜索优先级”较低(例如[^3]),这指的是在加载顺序列表中,`.yml`文件排在`.properties`文件之后。但这不改变覆盖行为:后加载的文件值会覆盖前加载的文件。因此,实际生效的配置值以`application.yml`为准[^1][^4]。 - 最佳实践:Spring Boot允许项目中有多个配置文件共存(如引用[^2]所述),但为了避免冲突,建议优先使用YAML格式(.yml)以获得更结构化的配置,尤其在复杂场景中。 #### 总结 - **直接回答**:在相同位置(例如classpath根目录)且无其他高优先级配置时,`application.yml`的优先级高于`application.properties`,因为它的配置值会覆盖后者。 - **推荐做法**:如果您需要确保配置一致性,可以: - 优先使用`application.yml`进行配置。 - 利用profile-specific文件(如`application-dev.yml`)来管理不同环境。 - 测试配置覆盖行为,使用`spring.config.location`参数指定自定义路径。 如果您有具体配置示例或环境细节,我可以提供更针对性的建议!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值