spring boot配置文件

一 Spring Boot项目结构
  • resources文件夹中目录结构
    • static:保存所有的静态资源; js css images,

包括html文件也放再static(约定大于配置);
只要保存在该目录下的静态资源可以直接访问

    • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf,不支持html文件)
    • application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

二 配置文件的使用
2.1 配置文件介绍

SpringBoot使用一个全局的配置文件(核心配置文件)

配置文件名在约定的情况下名字是固定的;

配置文件名称只能叫application.properties 或者 application.yml

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

SpringBoot在底层都给我们自动配置好了

2.2 两种配置文件的格式

在springboot框架中,resource文件夹里可以存放配置的文件有两种:properties和yml。

可共存和混用

1、application.properties的用法:扁平的k/v格式。

server.port=8081
server.servlet.context-path=cctv

2、application.yml的用法:树型结构

注意:server代表一个对象

server:
  port: 8082
  servlet:
    context-path: cctv

建议使用后者,因为它的可读性更强

如何互转:在线yaml转properties-在线properties转yaml-ToYaml.com

2.3 yml语法

k:(空格)v:表示一对键值对(空格必须有);

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

属性和值也是大小写敏感;

如果有特殊字符% & 记得用单引号‘ 包起来(了解)

2.4 配置文件的加载顺序

如果同时存在不同后缀的配置文件按照这个顺序加载主配置文件;互补配置;

实测后发现Spring Boot版本不一样优先级都不一样,比较混乱,这里统一说明下:

官方没有具体说明,以实测为准

实测 Spring Boot 2.7.3 版本以application.properties为准

总结: 官网建议整个应用程序使用一种格式,并且既然每个版本的优先级都有区别,我们就不要纠结这个后缀文件的优先级了。

2.5 外部约定配置文件加载顺序

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

以下扫描优先级由   低   到    高 第一(低优先级) :
扫描classpath根目录下的 application.properties或者application.yml

第二,扫描 classpath根目录下的config/

第三 直接指定配置文件  --spring.config.location

注意:使用外部配置文件后,不会再使用内部的配置

注意 如果只指定文件夹,没有指定具体的文件,则必须以  /  结尾

java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.config.location=D:\config/

也可以指定具体的配置文件

java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.config.location=D:\config\application.properties

结论:优先级由底到高,高优先级的配置会覆盖低优先级的配置;互补配置;

2.6 Profile文件的加载

SpringBoot框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。

1、多Profile文件

  • Spring官方给出的语法规则是application-{profile}.properties(/.yaml/.yml)。

        如: application-dev.properties

                 application-test.properties

                 application-prod.properties

application-dev.properties

server.port=8081
server.servlet.context-path=/cctv1

application-test.properties

server.port=8082
server.servlet.context-path=/cctv2

application-prod.properties

server.port=8083
server.servlet.context-path=/cctv3

  • 激活指定profile

1  若我们需要在三种环境下进行切换,只需要在application.properties中加入如下内容即可:根据不同的环境指定不同的配置

spring.profiles.active=dev----配置使用dev里面的配置项

2 在启动命令行指定,如下:

java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

2.7 所有配置文件按以下顺序加载: 优先级从低到高
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar

配置文件搜索顺序如下:

1  打包在jar中的配置文件(classpath)  ,如:

2  打包在jar中的配置文件( classpath : config/ 下),如:

3 打包在jar中的profile

4 打包在jar中的profile ( classpath : config/ 下)

5  打包的jar之外的配置文件

6 打包的jar之外的配置文件(还带config文件夹的)

7 打包的jar之外的profile

配置文件值注入

将YAML映射到属性

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

k: v:字面直接来写,字符串默认不用加上单引号或者双引号;

如:

name: zhangsan
age: 12
isDelete: true
2. 对象、Map(属性和值)(键值对):

k: v:在下一行来写对象的属性和值的关系;注意缩进
对象:

person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/1/1
3. 数组(List、Set) 用 - 值表示数组中的一个元素
person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/1/1
  pets: 
    - cat
    - dog
    - pig

行内写法:


person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/1/1
  pets: [cat,dog,pig]
  • 其他示例:
person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/1/1
  pets:
    - cat
    - dog
    - pig
  pets2: [cat1,dog1,pig1]
  maps: {k1: v1,k2: 12}
  maps2:
    k3: v3
    k4: v4
  dog:
    name: 小狗
    age: 12
  dogs1:
    - {name: 小狗1,age: 1}
    - {name: 小狗2,age: 2}
  dogs2: [{name: 小狗,age: 13},{name: 小狗1,age: 14}]
如何把YAML映射到 javaBean:
package com.cctv.beans;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
* 将配置文件中配置的每一个属性的值,映射到这个javabean组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件(application.properties)
 * 中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个javabean组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*
*/
//将JavaBean注入到容器里面
@Component
//将配置文件和JavaBean进行绑定。指定person这个前缀,JavaBean和配置文件的属性的值进行映射
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private List<String> pets;
    private Map<String,String> maps;
    private Map<String,String> maps2;
    private Dog dog;
    private List<Dog> dogs1;
    private List<Dog> dogs2;
    private String wife;
    private String address;
}
package com.cctv.beans;

public class Dog {
    private String name;
    private Integer age;
}
4. 如何 导入 Lombok

1 导入Jar包


<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.24</version>
			<scope>provided</scope>
		</dependency>

2.安装lombok插件

如何做到根据配置类,在编写 yml 配置的时候有提示

如果出现如下提示:

  • 1、添加依赖

<optional>true</optional>要设置一下 否则可能出现导入不了的情况

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
  • 、启动processor(勾选如图)

  • 3、重新编译模块(一定要重新编译一下 否则不能生效,生成下面一个META-INF)

Idea 社区版开启yaml文件自动提示功能

下载 Spring Boot Assistant 插件即可

  • 4 自定义配置的元数据信息生成了,我们可以先编写配置类,在 yml 配置即刻会有提示
  • 5 如果再重新定义JavaBean属性 必须重新编译
  • 6 经过一系列操作后 原有的配置也都有了提示

  • 松散绑定:
person:
  lastName: zhangsan  小驼峰
  last_name: zhangsan  蛇形
  last-name: zhangsan 烤肉串
  LASTNAME: zhangsan 
  ctrl+shift+u(大小写切换)
  
  以上4种命名是可以自动绑定bean属性  person.lastName
  • @Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties

@Value

绑定

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

自动提示

支持

不支持

使用场景

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

配置文件占位符

1、随机数

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

2、占位符获取之前配置的值,如果没有可以是用:指定默认值(重要)

${person.hello:hello}   这种表达方式非常重要

person.last‐name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值