目录
- Spring Boot 配置文件详解
- 一、Spring Boot 配置文件类型
- 1.1 `application.properties`(属性文件)
- 1.2 `application.yml`(YAML文件)
- 二、`application.properties `和 `application.yml `的优缺点分析
- 1. `application.properties`
- 1.1 优点
- 1.2 缺点
- 2. `application.yml`
- 2.1 优点
- 2.2 缺点
- 3. 对比分析
- 4. 使用建议
- 5. 示例对比
- 5.1 `application.properties` 示例
- 5.2 `application.yml` 示例
- 三、`yml`配置和`properties`配置的读取
- 3.1`properties`配置的读取
- 3.2`yml`配置的读取
- 四、 配置文件的加载顺序
- 五、 多环境配置
- 5.1 配置文件命名规则
- 5.2 激活环境
- 1. 命令行参数
- 2. 配置文件激活
- 六、 常用配置示例
- 6.1 服务器配置
- 6.2 数据库配置
- 6.3 日志配置
- 6.4 自定义配置属性
- 七、配置文件的注意事项
- 八、配置文件的加载位置
- 九、高级主题
- 9.1 配置文件的优先级
- 9.2 动态更新配置
- 9.3 使用随机端口
- 十、 总结
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文件)
- 使用 YAML 格式,结构清晰,适合复杂的配置场景。
- 支持层级结构和多环境配置,功能更强大。
示例:
# 配置项目端⼝号
server:port: 8080
二、application.properties
和 application.yml
的优缺点分析
1. application.properties
1.1 优点
- 简单易学: 基于键值对的形式,语法简单,易于理解和使用,适合新手快速上手。
- 轻量级:文件体积小,适合小型项目或简单的配置需求。
- 无需额外依赖:Spring Boot 默认支持
.properties
文件,无需引入其他依赖。- 错误提示:-在IDE中,
.properties
文件的错误提示相对友好,开发者可以快速定位问题。- 历史传统:具有较长的历史,许多开发者已经熟悉其语法和使用方式。
1.2 缺点
- 层级结构不足:无法直接通过缩进来表示层级关系,复杂配置时显得冗杂。 需要通过“.”来分隔层级,容易导致配置项过长。
- 不支持复杂数据类型:无法直接配置集合、列表等复杂数据类型。如果需要配置集合,需要通过逗号分隔,语法相对繁琐。
- 可读性差:对于复杂配置,
.properties
文件的可读性较差,难以快速理解配置结构。- 配置项冗长:对于需要层次结构的配置,
.properties
文件会显得过于冗长。
2. application.yml
2.1 优点
- 层次结构清晰:使用 YAML 格式,通过缩进表示层级关系,配置文件结构清晰,易于理解。适合复杂配置场景,能够直观地表达配置之间的关系。
- 支持复杂数据类型:支持列表、字典等复杂数据类型,配置更加灵活。可以直接在配置文件中定义数组、映射等结构。
- 可读性强:对于复杂的配置场景,YAML 文件的可读性远超
.properties
文件。通过层次结构,可以快速定位配置项。- 多环境配置便捷: YAML 文件支持多环境配置,通过不同的文件后缀(如
application-dev.yml
)轻松实现环境隔离。- 与 Docker.deltaTime 兼容:YAML 格式与 Docker 的配置文件格式类似,方便在微服务场景下使用。
2.2 缺点
- 语法要求严格:YAML 文件的缩进、空格等格式要求非常严格,稍有不慎会导致配置加载失败。对于新手来说,需要花时间学习 YAML 的语法规则。
- 对大型配置文件的性能影响:由于 YAML 文件的复杂性,加载和解析大型配置文件可能会带来一定的性能开销。
- 依赖snakeyaml库:Spring Boot 的 YAML 配置文件依赖于
snakeyaml
库,需要额外引入依赖。- 敏感信息处理复杂:在 YAML 文件中处理敏感信息(如密码)需要额外的配置和加密,操作相对复杂。
3. 对比分析
特性 | application.properties | application.yml |
---|---|---|
可读性 | 简单配置可读性高,但复杂配置可读性较差 | 无论简单还是复杂配置,层次结构清晰,可读性强 |
层次结构 | 无法通过格式表示层次结构,需通过“.”分隔 | 支持层次结构,通过缩进表示 |
复杂数据类型 | 不支持直接配置复杂数据类型 | 支持列表、字典等复杂数据类型 |
语法复杂性 | 语法简单,无需学习额外的格式 | 语法较复杂,需要学习 YAML 的基础知识 |
性能 | 解析速度快,性能开销小 | 对于大型配置文件,解析速度较慢,性能开销大 |
多环境配置 | 支持多环境配置,但实现相对繁琐 | 多环境配置实现简单,通过文件后缀即可轻松切换 |
开发成本 | 开发成本低,适合简单项目 | 开发成本稍高,但在复杂项目中更高效 |
4. 使用建议
-
选择
application.properties
的场景:- 项目配置较为简单,不需要复杂的层次结构。
- 开发团队对 YAML 格式不熟悉,希望快速上手。
- 需要快速Prototype(原型开发),不希望花费时间在配置文件格式上。
-
选择
application.yml
的场景:- 项目配置复杂,需要清晰的层次结构。
- 需要配置复杂数据类型(如列表、字典等)。
- 项目需要多环境配置,希望通过简单的方式实现环境切换。
- 项目团队熟悉 YAML 格式,能够快速上手。
5. 示例对比
5.1 application.properties
示例
server.port=8080
server.servlet.context-path=/myappspring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456myconfig.appName=My Spring Boot App
myconfig.version=1.0.0
5.2 application.yml
示例
server:port: 8080servlet:context-path: /myappspring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: rootpassword: 123456myconfig:appName: My Spring Boot Appversion: 1.0.0
从上述示例可以看出,
application.yml
的配置文件结构更清晰,层次更分明,易于理解和维护。
三、yml
配置和properties
配置的读取
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。@Value 注解使用" ${} "的格式读取
3.1properties
配置的读取
properties
配置文件:
java">#端口号
server.port=9090
#项目名称
spring.application.name=spring-boot-demo
#读取这个配置文件
Mylove.key=you
java">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;}
}
java">@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
配置文件:
java">#端口号
server:port=9090
#项目名称
spring:application:name: spring-boot-demo
#配置项目文件
Mylove:key1: you1
同理如上:
启动项目:
可以看到读取yml配置文件的值成功了。
再举几个读取yml配置的例子:
配置对象
java">#端口号
server:port=9090
#项目名称
spring:application:name: spring-boot-demo
#配置对象
student:name: 张三age: 18
这个时候就不能用
@Value
来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties
来读取,具体实现如下:
java">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;
}
java">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 {@Autowiredprivate Student student;@RequestMapping("test")private String GetSpringBoot(){return student.toString();}
}
启动:
java">@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}}
访问http:127.0.0.1:9090/yml/test
:
配置集合
java">#端口号
server:port=9090
#项目名称
spring:application:name: spring-boot-demo
#配置集合
types:name:- mysql- sqlserver- db2
补充代码进行观察测试:
java">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 ;
}
java">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 {@Autowiredprivate Lists list;@RequestMapping("test")private String GetSpringBoot(){return list.toString();}
}
启动:
java">@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.yml
或application.properties
。- 类路径下的
config
包:用于包内的配置。- 类路径下的配置文件:如
application.yml
或application.properties
。
通过合理规划配置文件的位置,可以实现环境隔离和配置管理。
提出问题:
当yml配置文件
和properties配置文件
同时存在,那么哪个优先级在前面呢?
我们用个简单的例子进行测试:
yml配置文件
java">#端口号
server:port=9090
properties配置文件
java">#端口号
server.port=8080
我们启动项目看用的是哪个端口号:
可以看到用的是8080这个端口号,可见当他们两个这个配置文件同时存在时候,properties配置文件的优先级更加高。
五、 多环境配置
在实际开发中,我们通常需要针对不同环境(如开发、测试、生产)配置不同的参数。Spring Boot 支持通过配置文件后缀来实现多环境配置。
5.1 配置文件命名规则
配置文件可以通过添加环境名称作为后缀,创建多个环境配置文件:
application.yml
:默认配置文件。application-dev.yml
:开发环境配置。application-test.yml
:测试环境配置。application-prod.yml
:生产环境配置。
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: 8080servlet:context-path: /myapp
6.2 数据库配置
spring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
6.3 日志配置
logging:level: INFOfile:name: logs/myapp.log
6.4 自定义配置属性
在 application.yml
中添加自定义属性:
myconfig:appName: My Spring Boot Appversion: 1.0.0
在代码中使用自定义属性:
java">@Configuration
@Component
public class MyConfig {@Value("${myconfig.appName}")private String appName;public String getAppName() {return appName;}
}
七、配置文件的注意事项
- 配置文件的位置:尽量避免将配置文件放在多个目录中,以免引发配置冲突。
- 环境隔离:不同环境的配置文件要明确区分,避免生产环境配置错误。
- 敏感信息:不要直接在配置文件中硬编码敏感信息(如密码),建议使用外部配置或加密方式。
- 文件格式:YAML 文件的缩进和格式尤为重要,格式错误可能导致应用启动失败。
八、配置文件的加载位置
除了默认的配置文件外,Spring Boot 还支持从以下位置加载配置文件:
- 外部文件目录:通过
--spring.config.location
参数指定。
java -jar --spring.config.location=/path/to/config/ myapp.jar
-
内部类路径:将配置文件放在
src/main/resources
目录下。 -
外部配置中心:结合 Spring Cloud Config 使用外部配置中心。
九、高级主题
9.1 配置文件的优先级
配置文件的加载顺序決定了配置的优先级,后加载的配置会覆盖前面的配置。
加载顺序 | 配置文件路径 |
---|---|
1 | file:./config/ |
2 | file:./ |
3 | classpath:config/ |
4 | classpath: |
9.2 动态更新配置
Spring Boot 提供了.DynamicPropertySource功能,可以实现配置的热更新。
9.3 使用随机端口
通过配置 server.port=0
可以让服务器随机分配端口。
十、 总结
Spring Boot 的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效。无论是简单的属性配置,还是复杂的多环境管理,Spring Boot 都提供了便捷的解决方案。在后续的学习中,可以深入探索 Spring Boot 的其他配置高级功能,如动态配置更新、配置文件加密等。
希望本文对你理解Spring Boot 配置文件有所帮助!如果有更多问题,欢迎留言讨论。