首页 > 解决方案 > 从静态字段中设置 spring 中的属性值

问题描述

我有一种情况,在application.name加载应用程序上下文之前,我需要一个属性值 () - spring boot,在调用 SpringApplication.run 之前以及在上下文加载期间。

在调用 SpringApplication.run 的 ApplicationMain 类中,我有一个常量public static final NAME = "MyApplicationName".

我的问题是我们有一些库通过@Value("${application.name}").

有没有办法application.name从这个常量值设置上下文中的属性?

我在想我可以做一个后期构造,然后在环境中设置它 - 类似于这里描述的解决方案,但这并不能保证它可用于所有注入@Value

我希望有一种与@Bean可以设置属性值的方法类似的机制,但我在任何地方都看不到。

标签: springspring-boot

解决方案


可以通过多种方式在 Spring Boot 上注入变量,但对我来说,最好的方法之一是在 *nix 或 Windows 中使用操作系统变量,您可以定义如下变量:

Windows
    SET APPLICATION_NAME = "MY APP"

*nix
    export APPLICATION_NAME = "MY APP"

请注意,下划线字符 (_) 已替换为 . 在您的应用程序中。另一种方法是使用使用 -Dapplication.name="MY APP" 定义的 Java 属性,该属性位于您的应用程序命令行中。在操作系统中定义这些变量后,您可以使用以下方法在代码中捕获它们:

    @Value("${application.name}")

因此,我再次建议您使用环境变量来存储您的应用程序配置,这样操作员或开发人员将能够更改您的应用程序行为,而无需触摸代码或内部属性文件(在您的应用程序包中)。

另一种方法是设置系统属性 (System.setProperty),这将使 Java 应用程序接收在运行时设置的变量。实际上是在命令行中使用 -D 使用的相同映射(系统映射),但是它是在运行时而不是在命令行中完成的。一个例子:

      System.setProperty("application.name","MY APP");

推荐阅读