本文主要是介绍Spring Boot 配置文件之类型、加载顺序与最佳实践记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂...
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=/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 SpringB编程ootDemoApplication { 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.RestCo编程ntroller; @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.yml
或application.properties
。
类路径下的 config
包:用于包内的配置。
类路径下的配置文件:如application.yml
或application.properties
。
通过合理规划配置文件的位置,可以实现环境隔离和配置管理。
提出问题:
当yml配置文件
和properties配置文件
同时存在,那么哪个优先级在前面呢?
我们用个简单的例子进行测试:
yml配置文件
#端口号 server: port=9090
properties配置文件
#端口号 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.javascript 配置文件激活
在 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 classhttp://www.chinasem.cn 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 配置文件有所帮助!如果有更多问题,欢迎留言讨论。
到此这篇关于Spring Boot 配置文件之类型、加载顺序与最佳实践记录的文章就介绍到这了,更多相关Spring Boot 类型、加载顺序内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Spring Boot 配置文件之类型、加载顺序与最佳实践记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!