Spring Boot中的外部配置和一次性测试

luk*_*mir 1 java spring properties spring-boot

Spring引导具有外部化配置的能力,这意味着you can work with the same application code in different environments.

您可以在jar中捆绑application.properties,它提供合理的默认名称.在生产环境中运行时,可以在jar之外提供覆盖名称的application.properties; 对于一次性测试,您可以使用特定的命令行开关启动:

java -jar app.jar --name="Spring"
Run Code Online (Sandbox Code Playgroud)
  1. 一次性测试实际上意味着什么?
  2. 我怎么样work with the same application code in different environments

Ste*_*eve 5

一次性测试

我发现通常在Spring Boot的上下文中,所提到的"一次性测试"往往是关于切换活动配置文件.例如,当我在本地运行我的应用程序时,我通常使用此命令:

java -jar myapp.jar --spring.profiles.active=scratch
Run Code Online (Sandbox Code Playgroud)

这会激活我的'scratch'配置文件,该配置文件会设置内存数据库并将一些基本测试数据导入其中.我有一个小run.sh脚本,我签入Git,其中包括.

当我在我的本地机器上玩时,这就是我想激活的配置文件.但是,对于偶尔的一次性测试,我可能希望针对更永久的数据库运行我的应用程序.要做到这一点,我只需要在我的命令行中调整活动的配置文件,就像这样......

java -jar myapp.jar --spring.profiles.active=sqlserver
Run Code Online (Sandbox Code Playgroud)

这将激活application-sqlserver.properties我的config目录中的文件,并设置由SQL Server数据库支持的本地运行的Spring Boot应用程序.这是一次性的,因为我不打算将它用作默认的构建数据库连接.

在不同环境中运行相同的应用程序代码

这为在不同环境中使用"相同的应用程序代码"提供了基础.假设您已经构建了一个示例Spring Boot应用程序,您应该已经注意到构建创建了一个.jar文件.我们的想法是将同一个.jar文件部署到所有环境中.这是一件好事,因为如果您在一个环境中测试过您的应用程序并希望升级到生产环境,那么您肯定希望确信您部署的代码与您刚刚测试的代码相同吗?

但是,显然您的每个环境都有不同的要求.在构建时,您可能希望使用内存数据库.但是,在集成测试环境中,您可能希望连接到物理数据库,例如MySQL,Oracle或SQL Server.您可能拥有单独的测试和生产数据库.每个环境都可以连接到不同的RabbitMQ集群.

Spring Boot通过外部化配置来支持此功能.它将自动在config应用程序根目录中调用的目录中查找属性.即你可以像这样创建一个目录结构......

myapp/
    config/
        application.properties
    myapp.jar
Run Code Online (Sandbox Code Playgroud)

...并且每个环境中唯一需要不同的是application.properties,您可以指向不同的数据库,LDAP目录,电子邮件系统,消息代理或每个环境中的其他任何不同的东西.

--name参数

正如Spring Boot文档中提到的访问命令行属性一样,开头的命令行参数--将转换为应用程序属性.因此--name,您将成为可在应用程序中访问的属性.值得注意的是,它不是启动Spring Boot应用程序所必需的参数.

作为旁注,--name在启动'NIX命令行进程时非常常用,以便您可以ps ax | grep Spring查看您的进程.通常这样你就可以杀了它.它不是Spring Boot应用程序的必需参数,而只是您引用的示例中使用的内容.该示例通过@Value("${name}")注释引用它.