我有一种情况,我需要一个属性值(application.name
)才能加载应用程序上下文 - spring boot,调用SpringApplication.run之前,以及上下文加载期间。
在我调用SpringApplication.run的ApplicationMain类中,我有一个常量public static final NAME = "MyApplicationName"
。
我的问题是我们有一些库通过@Value("${application.name}")
注入了值。
是否有办法在此常量值的上下文中设置application.name
属性?
我以为我可以做一个后期构建,然后在环境中设置它 - 类似于here所描述的解决方案,但这并不能保证它可用于所有注入{{1 }}
我希望@Value
在一个可以设置属性值的方法上有类似的机制,但是我没有在任何地方看到它。
答案 0 :(得分:1)
可以通过多种方式在Spring Boot上注入变量,但对我来说,最好的方法之一就是在* nix或Windows中使用操作系统变量,你可以定义这样的变量:
Windows
SET APPLICATION_NAME = "MY APP"
*nix
export APPLICATION_NAME = "MY APP"
请注意,下划线字符(_)将替换为。在你的申请中。其他方法是使用-Dapplication.name =“MY APP”定义的Java属性,该属性位于应用程序命令行中。在操作系统中定义了这些变量之后,您可以使用以下代码在代码中捕获它们:
@Value("${application.name}")
因此,我建议您再次使用环境变量来存储应用程序配置,这样操作员或devops人员就可以在没有触摸代码或内部属性文件的情况下(在应用程序包中)更改应用程序行为。
另一种方法是设置系统属性(System.setProperty),这将使Java应用程序接收在运行时设置的变量。实际上是在命令行中使用-D使用的相同映射(系统映射),但它是在运行时而不是在命令行中完成的。一个例子:
System.setProperty("application.name","MY APP");