在 Spring Boot 中设置环境变量前缀

1、概览

本文将带你了解 Spring Boot 2.5 中的一个新特性:为系统环境变量指定前缀。通过该特性,就可以在同一环境中运行多个不同的 Spring Boot 应用,只要所有属性都使用带前缀的版本。

2、环境变量前缀

有时,我们可能需要在同一个环境中运行多个 Spring Boot 应用,并且经常会面临环境变量名称分配的问题。现在,我们可以在应用级别设置一个 “前缀”,不同应用加载不同前缀的环境变量即可。

以一个简单的 Spring Boot 应用为例,通过设置前缀来修改应用属性,例如 tomcat 服务器端口。

关于 Spring Boot 中属性属性的优先级,你可以参阅 中文文档

2.1、Spring Boot 应用示例

创建一个 Spring Boot 应用。

首先,为应用设置一个前缀。为了简单起见,称之为 prefix

@SpringBootApplication
public class PrefixApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(PrefixApplication.class);
        // 设置环境变量前缀
        application.setEnvironmentPrefix("prefix");
        application.run(args);
    }
}

不能使用已经包含下划线字符(_)的单词作为前缀。否则,抛出异常。

再创建一个 API 端点,返回应用正在监听的端口:

@Controller
public class PrefixController {

    @Autowired
    private Environment environment;

    @GetMapping("/prefix")
    public String getServerPortInfo(final Model model) {
        model.addAttribute("serverPort", environment.getProperty("server.port"));
        return "prefix";
    }
}

在本例中,使用 Thymeleaf 模板来渲染页面,页面很简单:

<html>
    // ...
<body>
It is working as we expected. Your server is running at port : <b th:text="${serverPort}"></b>
</body>
</html>

2.2、设置环境变量

现在,将 prefix_server_port 这样的环境变量设置为 8085

例如在 Linux 中。

env prefix_server_port=8085

一旦设置了环境变量,应用就会根据该前缀创建属性。

在 IDE 中运行时,需要编辑启动配置并添加环境变量,或从已加载的环境变量中选取环境变量。

2.3、运行应用

通过命令行或最 IDE 启动应用。

然后使用浏览器访问 http://localhost:8085/prefix,可以看到端口是 8085,和我们在环境变量中配置的一致:

It is working as we expected. Your server is running at port : 8085

如果不加前缀,应用将使用默认环境变量启动。

3、总结

本文介绍了如何在 Spring Boot 中通过环境变量前缀来为不同应用的同名属性设置不同的值,从而实现在同一个环境中运行多个应用。


Ref:https://www.baeldung.com/spring-boot-env-variable-prefixes