124人参与 • 2026-05-14 • Java
在开发实际的 java 应用时,通常会遇到不同的运行环境,比如开发环境、测试环境和生产环境。
每个环境都有不同的配置需求,例如数据库连接信息、服务端口、日志级别等。
如果我们没有一个灵活的机制来区分和管理这些不同环境下的配置,代码中的配置就会变得混乱且不易维护。

spring boot 提供了强大的多环境配置管理功能,能够帮助我们根据不同的环境加载不同的配置文件,从而让应用在不同的环境下能保持一致性和灵活性。通过合理使用 spring boot 的 profile 功能,我们可以在开发、测试和生产等不同环境中,动态地切换配置,避免了硬编码配置的麻烦,提高了系统的可维护性。
在开发和部署应用程序时,通常会遇到多个不同的运行环境,例如开发环境、测试环境和生产环境。这些环境之间的差异主要体现在配置上,包括数据库连接、服务端口、日志级别、api 密钥等。为了更好地管理这些差异,spring boot 提供了多环境配置的机制,允许在不同的环境下加载不同的配置文件,从而使应用在各个环境中保持灵活性和一致性。

多环境配置的需求来源于应用在不同阶段和环境中可能需要不同的设置。比如:
通过将这些配置分开,我们能够更好地管理应用程序,并确保它在不同环境下的表现符合预期。
spring boot 通过 profiles 来支持多环境配置,允许在不同环境中加载不同的配置文件。每个配置文件可以针对不同的环境做出定制,比如:
spring boot 通过 spring.profiles.active 属性来标记当前使用的配置文件,动态切换不同的环境配置。
在 spring boot 中,可以通过以下方式实现不同环境的配置隔离:
在 spring boot 中,配置文件是管理应用程序设置的关键部分。spring boot 提供了一种简单而灵活的方式来处理配置,支持多种配置格式、层次结构、环境隔离等特性。

spring boot 默认支持两种配置文件格式:
application.properties:这是传统的 java 属性文件格式,每个配置项以 key=value 的形式存在。application.yml:yaml 格式的配置文件,比 properties 格式更具层次性和可读性,尤其对于结构化数据的表示非常方便。这些文件可以存放在项目的 src/main/resources 目录下,并且可以根据不同的环境进行灵活管理。
application.properties 示例:server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret
application.yml 示例:server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secretyaml 格式通过层级缩进来表示结构,能够更清晰地组织和表达配置数据。
spring boot 在启动时会按照一定的顺序加载配置文件,配置文件的加载优先级依次递增:
application.properties 或 application.yml:项目中的配置文件,默认加载。spring.config.location 指定外部的配置文件路径。在 spring boot 中,profile 是一种用于标识不同运行环境的机制,可以帮助我们在不同的环境下加载不同的配置。
application.properties 或 application.yml 中使用 spring.profiles.active 属性指定当前的运行环境(如开发、测试、生产等)。spring.profiles.active=dev
application-dev.properties 示例:
spring.datasource.url=jdbc:mysql://dev-db:3306/mydb
application-prod.properties 示例:
spring.datasource.url=jdbc:mysql://prod-db:3306/mydb
spring boot 允许将配置文件外部化,避免硬编码在应用中。常见的外部化方式有:
java -jar myapp.jar --spring.config.location=file:/path/to/application.properties
spring.config.location 和 spring.config.name 可以用于指定文件的位置和名称。在配置文件中,可能会涉及到敏感信息(如数据库密码、api 密钥等)。spring boot 提供了多种方式来保护这些敏感配置:
jasypt-spring-boot 等工具来加密配置文件中的敏感信息。在 spring boot 项目中,推荐使用如下方式来管理多环境配置:
spring.profiles.active 动态切换。在开发和部署应用程序时,通常会遇到不同的运行环境,例如开发环境、测试环境、生产环境等。每个环境的配置需求往往不同,比如数据库连接、服务端口、日志级别等。为了在不同的环境中灵活地加载和管理配置,spring boot 提供了 profiles 功能来实现多环境配置的管理。
spring boot 的 profile 是一种标识和管理不同环境的机制,可以根据当前激活的 profile 来加载不同的配置文件或配置项。通过 profile,开发者可以在开发、测试、生产等多个环境中维护不同的配置,避免在同一个配置文件中管理所有环境的配置。
profile 是通过 @profile 注解或者通过配置文件来激活的。在 spring boot 中,可以通过两种方式来指定当前使用的 profile:
application.properties 或 application.yml 文件中,可以通过 spring.profiles.active 来设置当前激活的 profile。# application.properties spring.profiles.active=dev
或者,在 application.yml 中设置:
spring:
profiles:
active: dev
这里,dev 就是当前激活的 profile。
-dspring.profiles.active 参数来指定 profile。例如:java -jar myapp.jar --spring.profiles.active=prod
spring_profiles_active 来指定激活的 profile。例如,在 linux 或 macos 中:export spring_profiles_active=prod
然后启动应用。
spring boot 会根据当前激活的 profile 来加载对应的配置文件。例如,假设你有多个不同环境的配置文件:
如果在 application.properties 或 application.yml 中配置了 spring.profiles.active=dev,那么 spring boot 会加载 application-dev.properties 文件中的配置。不同的 profile 可以有不同的配置文件,spring boot 会根据激活的 profile 加载与之匹配的配置文件。
除了在配置文件中使用 profile,spring boot 还允许我们在代码中使用 @profile 注解来根据 profile 的激活与否选择是否加载某些 bean。例如:
@configuration
@profile("dev")
public class devconfig {
@bean
public datasource datasource() {
// 开发环境的数据源配置
return new datasource("dev-db-url");
}
}
@configuration
@profile("prod")
public class prodconfig {
@bean
public datasource datasource() {
// 生产环境的数据源配置
return new datasource("prod-db-url");
}
}
在上面的示例中,只有当 dev profile 被激活时,devconfig 中的配置才会生效;只有当 prod profile 被激活时,prodconfig 中的配置才会生效。
在多个配置文件中,如果有相同的配置项,spring boot 会根据文件的加载顺序和 profile 的优先级来决定最终的配置值。例如:
如果在 application.properties 中配置了 server.port=8080,在 application-prod.properties 中配置了 server.port=80,并且激活了 prod profile,那么最终的端口配置会使用 application-prod.properties 中的 server.port=80。
spring boot 提供了灵活的配置机制,可以轻松将应用程序的配置外部化,避免将敏感信息(如数据库密码、api 密钥等)硬编码在代码中。外部化配置不仅可以使应用程序更具可维护性,还能提高灵活性和安全性。尤其在容器化、微服务架构中,外部化配置变得尤为重要。
外部化配置指的是将应用程序的配置从代码中分离出来,将其存储在外部位置(如文件、环境变量、配置服务器等)。spring boot 支持从多种外部源加载配置,这样就可以避免每次更改配置时都需要重新构建和部署应用程序。
spring boot 提供了多种外部化配置的方式,可以根据需求选择合适的方法。
spring boot 支持将配置文件放在项目外部,或者通过命令行传入外部配置。常见的做法是使用 application.properties 或 application.yml,并将其存放在外部目录。
--spring.config.location 参数指定配置文件的路径。例如,在启动命令中指定配置文件:java -jar myapp.jar --spring.config.location=file:/path/to/application.properties
export spring_config_location=/path/to/application.properties java -jar myapp.jar
spring boot 支持通过操作系统的环境变量来覆盖配置文件中的设置。环境变量的优先级高于配置文件中的属性,特别适合用于存储敏感信息或在生产环境中动态配置参数。
通过环境变量配置数据库连接:
export spring_datasource_url=jdbc:mysql://localhost:3306/mydb export spring_datasource_username=root export spring_datasource_password=secret
这些环境变量会覆盖 application.properties 文件中的相应配置。
spring boot 允许在启动应用时通过命令行参数传递配置值,命令行参数的优先级最高。例如:
java -jar myapp.jar --server.port=8081 --spring.datasource.url=jdbc:mysql://localhost:3306/testdb
这将覆盖 application.properties 中的相应配置。
对于复杂的微服务架构,spring cloud 提供了配置中心(spring cloud config)来集中管理和外部化配置。配置中心可以将所有应用的配置统一存储在 git 仓库、数据库或文件系统中,并通过 http 服务提供给应用使用。
应用从 spring cloud config 服务器拉取配置。
配置可以按环境、按应用进行划分,支持动态刷新和更新。
集中管理:多个微服务共享配置,统一管理。
动态刷新:通过 spring cloud bus 可以实现配置的动态刷新,无需重启应用。
版本控制:通过 git 实现配置的版本控制。
spring boot 会按照一定的优先级加载配置项,如果不同来源的配置项有重复,后加载的配置将覆盖前加载的配置。配置的加载顺序如下:
application.properties 或 application.yml:项目中的配置文件。因此,如果在不同的位置配置了相同的属性,spring boot 会使用优先级更高的配置。
为了确保应用程序的安全性,敏感信息(如数据库密码、api 密钥等)不应该存储在版本控制系统中。spring boot 提供了以下几种方式来处理敏感信息:
jasypt,加密配置文件中的敏感信息,然后在运行时解密。例如,使用 jasypt 加密 application.properties 文件中的数据库密码:
spring.datasource.password=enc(encrypted_password)
为了管理不同环境下的配置,spring boot 允许根据不同的 profile 使用不同的配置文件。例如,可以为开发、测试、生产环境创建不同的配置文件,spring boot 会根据当前激活的 profile 加载相应的配置。
application-dev.properties:开发环境配置。application-prod.properties:生产环境配置。application-test.properties:测试环境配置。激活 profile 后,spring boot 会自动加载相应的配置文件:
# application.properties spring.profiles.active=dev
或者,通过命令行参数指定 profile:
java -jar myapp.jar --spring.profiles.active=prod
在实际的开发和部署中,应用程序通常需要在多个环境中运行,例如开发环境、测试环境和生产环境。每个环境的配置通常会有所不同,如数据库连接、缓存配置、日志级别等。spring boot 提供了多种方式来管理和切换不同环境的配置,以便在不修改代码的情况下,能够根据环境的不同自动加载对应的配置。
spring boot 允许通过使用不同的配置文件来管理不同环境的配置。我们可以为每个环境创建独立的配置文件,并通过 profile 来指定当前激活的环境。spring boot 会根据激活的 profile 加载对应的配置文件。
profile 是 spring 框架的一种机制,用于标识和区分不同的环境。通过 profile,可以在开发环境、测试环境和生产环境之间切换配置,确保每个环境有合适的配置。
spring boot 通过 application.properties 或 application.yml 文件来存储配置。为了支持多环境配置,我们可以创建多个配置文件,按照环境的不同进行区分。
application.properties 或 application.yml:用于存储通用配置。application-dev.properties 或 application-dev.yml:用于开发环境配置。application-prod.properties 或 application-prod.yml:用于生产环境配置。application-test.properties 或 application-test.yml:用于测试环境配置。要使用不同的配置文件,必须激活相应的 profile,spring boot 提供了几种激活 profile 的方式:
spring.profiles.active 设置:可以在 application.properties或 application.yml 中通过 spring.profiles.active 属性来指定激活的 profile。例如:# application.properties spring.profiles.active=dev
或者在 application.yml 中:
spring:
profiles:
active: dev
java -jar myapp.jar --spring.profiles.active=prod
export spring_profiles_active=prod java -jar myapp.jar
@configuration
@profile("dev")
public class devconfig {
@bean
public datasource datasource() {
return new datasource("jdbc:mysql://localhost:3306/devdb");
}
}
spring boot 会根据 profile 的优先级顺序加载配置文件:
application.properties 或 application.yml:这是全局的配置文件,适用于所有环境。application-{profile}.properties 或 application-{profile}.yml:根据激活的 profile 加载相应的配置文件。例如,如果激活的是 dev profile,则加载 application-dev.properties 文件中的配置。为了更好地管理不同环境的配置,常见的做法是将敏感信息和环境特定的配置如数据库连接、第三方服务的 api 密钥、日志级别等单独管理。
开发环境中的配置通常比较宽松,适合进行调试和测试。常见的开发环境配置有:
# application-dev.properties spring.datasource.url=jdbc:mysql://localhost:3306/devdb spring.datasource.username=dev_user spring.datasource.password=dev_password logging.level.root=debug
生产环境配置需要更加严格和高效,通常包括:
# application-prod.properties spring.datasource.url=jdbc:mysql://prod-db-server:3306/proddb spring.datasource.username=prod_user spring.datasource.password=prod_password logging.level.root=info
测试环境中的配置主要用于单元测试和集成测试,通常包括:
# application-test.properties spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.username=test_user spring.datasource.password=test_password logging.level.root=debug
对于一些敏感数据(如数据库密码、api 密钥等),可以将配置外部化到环境变量、命令行参数或配置服务器中,避免将敏感信息写入配置文件。spring boot 支持从环境变量、jndi、命令行参数、spring cloud config 等多种外部化方式读取配置。
在现代应用程序中,配置文件通常包含敏感数据,如数据库密码、api 密钥、用户名等。如果这些信息被泄露,可能会导致严重的安全问题。因此,如何保护配置文件中的敏感数据,是开发和运维过程中必须关注的重点。spring boot 提供了多种方式来加密配置文件中的敏感数据,确保在使用配置文件时,不会暴露敏感信息。
在开发和生产环境中,敏感数据的保护尤为重要。常见的敏感数据包括:
为了防止敏感数据的泄露,我们通常会采取加密手段,确保即使配置文件被非法访问,也无法获取敏感信息。
加密配置文件中的敏感数据,常见的方式有:
spring boot 并没有直接提供加密配置文件的功能,但可以通过结合第三方库来实现加密。常用的加密方案包括:
jasypt(java simplified encryption):这是一个开源的加密工具,可以用来加密配置文件中的敏感数据。它支持对属性进行加密和解密,并提供简单的集成方式。
spring cloud config + vault:spring cloud config 提供了集中式配置管理,vault 是 hashicorp 提供的安全工具,专门用于存储和保护敏感数据。结合 vault 和 spring cloud config,可以有效地加密配置文件中的敏感信息。
jasypt 是 java 中最常用的加密工具之一,它提供了易于集成的加密方案,适合用来加密 spring boot 配置文件中的敏感信息。
首先,在 pom.xml 中添加 jasypt 的依赖:
<dependency>
<groupid>org.jasypt</groupid>
<artifactid>jasypt-spring-boot-starter</artifactid>
<version>3.0.3</version>
</dependency>使用 jasypt 加密属性时,首先需要对敏感数据进行加密。可以通过 jasypt 提供的工具进行加密,示例如下:
import org.jasypt.util.text.basictextencryptor;
public class encryptpassword {
public static void main(string[] args) {
basictextencryptor encryptor = new basictextencryptor();
encryptor.setpassword("secretkey"); // 设置加密密钥
string encryptedpassword = encryptor.encrypt("mypassword123"); // 加密敏感信息
system.out.println(encryptedpassword);
}
}
将加密后的密码放入 application.properties 或 application.yml 中,格式为 enc(…):
spring.datasource.password=enc(1y2l1g0uht9hgddkxst8tg==)
在 spring boot 启动时,jasypt 会自动解密这些加密过的配置项。为此,需要在 application.properties 中配置解密所需的密钥:
jasypt.encryptor.password=secretkey
当 spring boot 启动时,它会使用 secretkey 来解密配置文件中的敏感数据,并将其加载到 spring 环境中。
spring cloud config 与 hashicorp vault 是用于集中式配置和敏感数据存储的强大工具。vault 提供了一个安全的存储库,用于存储应用程序的敏感数据,如 api 密钥、数据库凭证等。spring cloud config 可以与 vault 集成,以便在应用程序启动时从 vault 中读取敏感配置。
首先,您需要设置 vault 服务器,并将敏感数据存储到 vault 中。例如,将数据库密码存储为一个密钥:
vault kv put secret/myapp/db password="my-secret-password"
在 application.properties 中配置 vault 作为配置源:
spring.cloud.config.uri=http://localhost:8888 # spring cloud config 服务器的地址 spring.cloud.config.server.vault.backend=secret # 配置 vault 密钥后端 spring.cloud.config.server.vault.default-context=myapp
当应用程序启动时,spring cloud config 会自动从 vault 中加载敏感数据,而不会暴露敏感数据在配置文件中。例如,password 就会从 vault 中安全地加载,而不会被硬编码在配置文件里。
在某些情况下,环境变量是一个比配置文件更安全的存储敏感信息的方式。例如,可以通过 ci/cd 系统或 docker 等平台将密钥和密码设置为环境变量,这样它们不会出现在配置文件或源代码中。
spring boot 支持通过环境变量读取配置:
spring.datasource.password=${db_password}
通过 export db_password=my-secret-password 来设置环境变量,spring boot 会在启动时读取该值。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论