java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot 类型、加载顺序

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

作者:权^

Spring Boot 的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂的多环境管理,Spring Boot都提供了便捷的解决方案,本文介绍Spring Boot 配置文件:类型、加载顺序与最佳实践,感兴趣的朋友一起看看吧

Spring Boot 配置文件详解

Spring Boot 是一个基于 Java 的快速开发框架,它通过自动化配置和简化设置,使开发者能够更专注于业务逻辑的实现。配置文件是 Spring Boot 应用配置的核心,通过它我们可以轻松地调整应用的运行环境、功能参数等。本文将详细介绍 Spring Boot 配置文件的使用方法、常见场景及注意事项。

很多项目或者框架的配置信息也放在配置文件中, 比如:
• 项目的启动端口
• 数据库的连接信息(包含用户名和密码的设置)
• 第三方系统的调用密钥等信息
• 用于发现和定位问题的普通日志和异常日志等.

一、Spring Boot 配置文件类型

Spring Boot 支持两种主要的配置文件类型:

1.1 application.properties(属性文件)

properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项目默认的配置文件。

properties 是以键值的形式配置的,key 和 value 之间是以"="连接的。
示例:
在之前的文章当中,启动时用的端口号是8080,可以通过配置文件来更改端口号:

# 配置项目端⼝号
server.port=9090

1.2 application.yml(YAML文件)

示例:

# 配置项目端⼝号
server:
  port: 8080

二、application.properties 和 application.yml 的优缺点分析

1. application.properties

1.1 优点

1.2 缺点

2. application.yml

2.1 优点

2.2 缺点

3. 对比分析

特性application.propertiesapplication.yml
可读性简单配置可读性高,但复杂配置可读性较差无论简单还是复杂配置,层次结构清晰,可读性强
层次结构无法通过格式表示层次结构,需通过“.”分隔支持层次结构,通过缩进表示
复杂数据类型不支持直接配置复杂数据类型支持列表、字典等复杂数据类型
语法复杂性语法简单,无需学习额外的格式语法较复杂,需要学习 YAML 的基础知识
性能解析速度快,性能开销小对于大型配置文件,解析速度较慢,性能开销大
多环境配置支持多环境配置,但实现相对繁琐多环境配置实现简单,通过文件后缀即可轻松切换
开发成本开发成本低,适合简单项目开发成本稍高,但在复杂项目中更高效

4. 使用建议

选择 application.yml 的场景:

5. 示例对比

5.1 application.properties 示例

server.port=8080
server.servlet.context-path=/myapp
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456
myconfig.appName=My Spring Boot App
myconfig.version=1.0.0

5.2 application.yml 示例

server:
  port: 8080
  servlet:
    context-path: /myapp
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: root
    password: 123456
myconfig:
  appName: My Spring Boot App
  version: 1.0.0

从上述示例可以看出,application.yml 的配置文件结构更清晰,层次更分明,易于理解和维护。

三、yml配置和properties配置的读取

如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。@Value 注解使用" ${} "的格式读取

3.1properties配置的读取

properties配置文件:

#端口号
server.port=9090
#项目名称
spring.application.name=spring-boot-demo
#读取这个配置文件
Mylove.key=you
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("Mylove")
public class MyController {
    @Value("${Mylove.key}")
    private String key;
    @RequestMapping("getMylove")
    public String ggetMylove() {
        return "读取到配置文件的值:"+key;
    }
}
@SpringBootApplication
public class SpringBootDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}
}

启动项目:用浏览器打开 http:127.0.0.1:9090/Mylove/Mylove :

可以看到读取到了配置文件的值。

3.2yml配置的读取

yml配置文件:

#端口号
server:
  port=9090
#项目名称
spring:
  application:
     name: spring-boot-demo
#配置项目文件
Mylove:
  key1: you1

同理如上:
启动项目:

可以看到读取yml配置文件的值成功了。

再举几个读取yml配置的例子:
配置对象

#端口号
server:
  port=9090
#项目名称
spring:
  application:
     name: spring-boot-demo
#配置对象
student:
  name: 张三
    age: 18

这个时候就不能用@Value来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties 来读取,具体实现如下:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private String name;
    private int age;
}
import com.slivqers.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("yml")
public class SpringBootController {
    @Autowired
    private Student student;
    @RequestMapping("test")
    private String GetSpringBoot(){
        return student.toString();
    }
}

启动:

@SpringBootApplication
public class SpringBootDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}
}

访问http:127.0.0.1:9090/yml/test :

配置集合

#端口号
server:
  port=9090
#项目名称
spring:
  application:
     name: spring-boot-demo
#配置集合
types:
  name:
    - mysql
    - sqlserver
    - db2

补充代码进行观察测试:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "types")
@Data
public class Lists{
    private List<String> name ;
}
import com.slivqers.model.Lists;
import com.slivqers.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("yml")
public class SpringBootController {
    @Autowired
    private Lists list;
    @RequestMapping("test")
    private String GetSpringBoot(){
        return list.toString();
    }
}

启动:

@SpringBootApplication
public class SpringBootDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}
}

访问:http://127.0.0.1:9090/yml/test

四、 配置文件的加载顺序

Spring Boot 配置文件的加载顺序如下:

当前目录下的 config 目录:优先级最高。
当前目录下的配置文件:如 application.ymlapplication.properties
类路径下的 config 包:用于包内的配置。
类路径下的配置文件:如 application.ymlapplication.properties
通过合理规划配置文件的位置,可以实现环境隔离和配置管理。

提出问题
yml配置文件properties配置文件同时存在,那么哪个优先级在前面呢?

我们用个简单的例子进行测试:

yml配置文件

#端口号
server:
  port=9090

properties配置文件

#端口号
server.port=8080

我们启动项目看用的是哪个端口号:

可以看到用的是8080这个端口号,可见当他们两个这个配置文件同时存在时候,properties配置文件的优先级更加高。

五、 多环境配置

在实际开发中,我们通常需要针对不同环境(如开发、测试、生产)配置不同的参数。Spring Boot 支持通过配置文件后缀来实现多环境配置。

5.1 配置文件命名规则

配置文件可以通过添加环境名称作为后缀,创建多个环境配置文件:

5.2 激活环境

可以通过以下方式激活特定环境:

1. 命令行参数

在启动应用时,通过 --spring.profiles.active 参数指定环境:

java -jar --spring.profiles.active=dev myapp.jar

2. 配置文件激活

application.yml 文件中直接配置激活环境:

spring:
  profiles:
    active: dev

六、 常用配置示例

以下是一些常见的配置场景示例:

6.1 服务器配置

server:
  port: 8080
  servlet:
    context-path: /myapp

6.2 数据库配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

6.3 日志配置

logging:
  level: INFO
  file:
    name: logs/myapp.log

6.4 自定义配置属性

application.yml 中添加自定义属性:

myconfig:
  appName: My Spring Boot App
  version: 1.0.0

在代码中使用自定义属性:

@Configuration
@Component
public class MyConfig {
    @Value("${myconfig.appName}")
    private String appName;
    public String getAppName() {
        return appName;
    }
}

七、配置文件的注意事项

八、配置文件的加载位置

除了默认的配置文件外,Spring Boot 还支持从以下位置加载配置文件:

外部文件目录:通过 --spring.config.location 参数指定。

java -jar --spring.config.location=/path/to/config/ myapp.jar

内部类路径:将配置文件放在 src/main/resources 目录下。

外部配置中心:结合 Spring Cloud Config 使用外部配置中心。

九、高级主题

9.1 配置文件的优先级

配置文件的加载顺序決定了配置的优先级,后加载的配置会覆盖前面的配置。

加载顺序配置文件路径
1file:./config/
2file:./
3classpath:config/
4classpath:

9.2 动态更新配置

Spring Boot 提供了.DynamicPropertySource功能,可以实现配置的热更新。

9.3 使用随机端口

通过配置 server.port=0 可以让服务器随机分配端口。

十、 总结

Spring Boot 的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效。无论是简单的属性配置,还是复杂的多环境管理,Spring Boot 都提供了便捷的解决方案。在后续的学习中,可以深入探索 Spring Boot 的其他配置高级功能,如动态配置更新、配置文件加密等。

希望本文对你理解Spring Boot 配置文件有所帮助!如果有更多问题,欢迎留言讨论。

到此这篇关于Spring Boot 配置文件之类型、加载顺序与最佳实践记录的文章就介绍到这了,更多相关Spring Boot 类型、加载顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文