SpringBoot配置文件还能这么玩,你知道吗?

文摘   科技   2024-12-16 08:02   新疆  

Spring Boot 3实战案例合集》现已囊括超过60篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

环境:Spring Boot3.2.5


1. 简介
在之前的一篇文章中,我们已经对Spring Boot配置文件进行了详细的探讨和介绍。文章深入解析了Spring Boot如何从不同的来源加载配置属性,包括但不限于application.properties或application.yml文件、命令行参数、系统环境变量等。建议下阅读下面这篇文章:
一文彻底搞明白SpringBoot外部化配置文件
在Spring Boot项目中我们通常都会为不同的环境提供不同的配置文件,如:开发、  测试生产在这3个环境中定义不同的配置信息。如下示例:

针对不同的环境提供不同的配置文件application-{profile}.yml。而具体使用哪个配置文件,通过如下配置方式指定:
  • application.yml指定
spring:  profiles:    active:    - prod
spring.profiles.active是个List集合,所以这里我们可以配置多个。
  • 通过命令行参数指定
java -jar app.jar --spring.profiles.active=prod
通过spring.profiles.active属性激活配置文件,有如下缺点:
  • 灵活性
    该属性属于全局设置,一旦设置影响的是整个配置加载;这样显然不够灵活,粒度太粗了。
  • 组织结构
    更侧重于通过文件命名约定来组织和区分不同环境的配置。
接下来,我们将介绍另外一种激活配置的方式
spring.config.activate.on-profile

2. 处理多文档文件
首先我们要介绍的是关于SpringBoot多文档文件。
2.1 多文档简介
Spring Boot 允许你将单个物理文件分割成多个逻辑文档,每个文档都是独立添加的。文档按从上到下的顺序处理。后面的文档可以覆盖前面文档中定义的属性。
对于 application.yml 文件,使用标准的 YAML 多文档语法。三个连续的连字符"---"代表一个文档的结束和下一个文档的开始。示例如下:
spring:  application:    name: pack-app---logging:  pattern:    dateformat: yyyy-MM-dd HH:mm ---spring:  profiles:    active:    - prod
如果你使用的properties格式,那么是通过如下方式
spring.application.name=pack-app#---logging.pattern.dataformat=yyyy-MM-dd HH:mm
了解了上面的基础知识后,接下来我们就来介绍如何使用spring.config.activate.on-profile配置属性。
2.2 激活特定文件
有时,只有在满足特定条件时才能激活特定的属性集。例如,可能有一些属性只有在特定配置文件处于活动状态时才有用。这时候我们就可以使用 spring.config.activate.* 有条件地激活属性文档。示例如下:
spring:  profiles:    active:    - test    - live---pack.app:  name: dev appspring.config.activate:  on-profile:  - dev---pack.app:  name: test appspring.config.activate:  on-profile:  - test---pack.app:  name: prod appspring.config.activate:  on-profile:  - prod
根据这里spring.profiles.active配置的不同profile,激活下面不同的逻辑文档。
如上配置示例,输出结果
@Value("${pack.app.name}")private String appName ;// 输出test app
这样在一个配置文件中就控制了不同的配置信息。
如果我们没有指定spring.profiles.active结果或者是设置的profile不存在下面配置的又会如何呢?控制台将会输出错误

如果没有配置,或者激活的不存在那么这些逻辑文档将不会生效。
除此之外,我们可以通过如下属性指定运行的云平台。
spring.config.activate:  on-cloud-platform: xxx
on-cloud-platform属性支持如下属性:

这些云平台又是如何验证的呢?我们以kubernetes为例说明:
public enum CloudPlatform {  KUBERNETES {    private static final String KUBERNETES_SERVICE_HOST = "KUBERNETES_SERVICE_HOST";    private static final String KUBERNETES_SERVICE_PORT = "KUBERNETES_SERVICE_PORT";
public boolean isDetected(Environment environment) { if (environment instanceof ConfigurableEnvironment configurableEnvironment) { return isAutoDetected(configurableEnvironment); } return false; }
private boolean isAutoDetected(ConfigurableEnvironment environment) {      // 获取当前系统环境信息systemEnvironment PropertySource<?> environmentPropertySource = environment.getPropertySources() .get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME); if (environmentPropertySource != null) {        // 判断是否存在上面定义的两个常量值信息 if (environmentPropertySource.containsProperty(KUBERNETES_SERVICE_HOST) && environmentPropertySource.containsProperty(KUBERNETES_SERVICE_PORT)) { return true; }        // other } return false; } }}
其它平台的检测就更加简单了。完整示例如下:
---pack.app:  name: dev appspring.config.activate:  on-cloud-platform: kubernetes  on-profile:  - dev---
当前运行的平台必须是kubernetes,并且激活的配置必须是dev才会生效。

以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

Spring一个很少使用但是非常强大的功能
Spring6.2震撼来袭,多线程实例化Bean应用启动速度飙升!
Java并发编程:最佳实践与性能优化
高级开发!Spring Boot 乐观锁正确处理的3种方案,第三种方案最优雅
高级开发!Spring Boot 自定义SQL日志记录(包括, 参数,耗时),支持MyBatis,JPA等
SpringBoot一个注解轻松实现多版本Rest API接口控制
SpringBoot整合Flink CDC,实时追踪数据变动,无缝同步至Redis
一个注解完美实现分布式锁
简单!详解@RefreshScope动态刷新核心原理
SpringBoot接口参数如何使用多个@RequestBody?
避坑!为了性能Spring挖了一个大坑
SpringBoot+Nginx+Lua接口性能提升N倍
提升性能:Java工程师必备的20条SQL最佳实践
Java开发人员必须掌握的11种干净代码最佳实践

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章