一、SpringBoot配置

61 阅读4分钟

配置文件分类

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml (application.yaml) 进行配置。

优先级:properties > yml > yamls
注意当高优先级文件存在的属性,低优先级文件里面相同的属性不会生效


yaml

基本介绍

YAML全称是 YAML Ain't Markup Language。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅 读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如:C/C++,Ruby. Python, Java, Perl, C#, PHP 等。YML文件是以数据为核心的,比传统的xml方式更加简洁。 YAML文件的扩展名可以使用yml或者yaml。以数据为核心

image.png

yaml基本语法

• 大小写敏感
• 数据值前边必须有空格,作为分隔符
• 使用缩进表示层级关系
• 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)。
• 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
• # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

yaml数据格式

  • 对象(map):键值对的集合
person: 
    name: zhangsan
# 行内写法
person: {name: zhangsan}
  • 数组:一组按次序排列的值
address: 
    -shanghai
    -shanghai
#行内写法
address: [beijing,shanghai]
  • 纯量:单个的不可再分的值
msg1:'hello \n world' #单引忽略转义字符
msg2:"hello \n world" #双引识别转义字符

读取配置文件内容

yml 文件内容

server:
  port: 8081

name: zhangsan

person:
  name: ${name}

address:
  - beijing
  - shanghai

1. @Value

  1. @Value 注解可以用于将配置文件中的属性值注入到 Spring Bean 中。你可以在需要读取配置属性的地方直接使用 @Value 注解,并指定属性的键值,Spring Boot 会自动将配置文件中对应键的值注入到该属性中。例如:
//在 controller 层使用注解读取配置文件
//读取单个值
@Value("${name}")
private String name;

//读取对象中的值
@Value("${person.name}")
private String name1;

//读取数组中的值
@Value("${address[1]}")
private String address;

在上面的示例中,${name} 是配置文件中的属性键,Spring Boot 会自动将其对应的值注入到 name 属性中。


2. Environment

因为@Value 一次只能读取一个值,所以当我们要读取的配置文件数据多了就可以用我们的 Environment
通过 Environment 对象直接访问配置属性。Spring Boot 将配置文件中的属性值加载到 Environment 中,你可以通过 Environment 对象的方法来获取这些属性值。例如:

@Autowired
private Environment env;

//方法中使用 env.getProperty 获取对应的字段值
System.out.println(env.getProperty("person.name"));

3. @ConfigurationProperties

@ConfigurationProperties 注解可以用于将配置文件中的属性值映射到一个 JavaBean 中。你可以创建一个 JavaBean 类,其中的属性与配置文件中的属性一一对应,然后使用 @ConfigurationProperties 注解标记该类,并指定配置文件中的前缀。Spring Boot 会自动将配置文件中以指定前缀开头的属性值注入到该 JavaBean 对象中。例如:

创建一个 javaBean

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

在 controller 中使用该 javaBean

@Autowired
private Person person;

System.out.println(person);

profile

我们在开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。


profile配置方式

1️. 多profile文件方式

image.png

application.yml

#当在原文件定义active时就会读取对应配置文件
spring:
  profiles:
   active: pro

application-dev.yml

server:
  port: 8081

application-test.yml

server:
  port: 8082

application-pro.yml

server:
  port: 8083

2. yml 多文档方式

SpringBoot旧版使用

---
server:
  port: 8083

spring:
  profiles: pro
---
spring:
  profiles:
    active: pro

SpringBoot 新版使用

---
server:
  port: 8081
spring:
  config:
    activate:
      on-profile: dev
---
server:
  port: 8082

spring:
  config:
    activate:
      on-profile: test
---
server:
  port: 8083

spring:
  config:
    activate:
      on-profile: pro
---
spring:
  profiles:
    active: pro

profile激活方式

配置文件方式

配置文件中配置:spring.profiles.active=dev

虚拟机参数

VM options

截屏2024-04-17 01.11.10.png

命令行参数

Program arguments

截屏2024-04-17 01.08.02.png

通过外部参数的方式动态激活配置

  • 通过 maven 插件,package 打包 SpringBoot 项目

截屏2024-04-17 01.20.42.png

  • 在终端中使用java -jar 'jar包路径'

截屏2024-04-17 01.23.54.png


内部配置加载顺序

Springboot程序启动时,会从以下位置加载配置文件:

  1. file:/config/:当前项目下的/config目录下
  2. file:/ :当前项目的根目录
  3. classpath:/config/: classpath的/config目录
  4. classpath:/ :classpath的根目录 (这里的 classpath 其实就是 resource 编译后的路径)

加载顺序为上文的排列顺序,高优先级配置的属性会生效


外部配置加载顺序

和 SpringBoot jar包平级配置文件

当有一个配置文件和 jar 包在同级目录下时,会自动加载该配置文件的配置信息

在命令行直接指定配置参数

java -jar ./demo-0.0.1-SNAPSHOT.jar --server.port=8084 --server.servlet.context-path=/haha

指定外部配置文件

java -jar ./demo-0.0.1-SNAPSHOT.jar --spring.config.location=/Users/hxy/code/java/IdeaProjects/config/application.yml