spring - 从静态字段中设置 spring 中的属性值
问题描述
我有一种情况,在application.name
加载应用程序上下文之前,我需要一个属性值 () - spring boot,在调用 SpringApplication.run 之前以及在上下文加载期间。
在调用 SpringApplication.run 的 ApplicationMain 类中,我有一个常量public static final NAME = "MyApplicationName"
.
我的问题是我们有一些库通过@Value("${application.name}")
.
有没有办法application.name
从这个常量值设置上下文中的属性?
我在想我可以做一个后期构造,然后在环境中设置它 - 类似于这里描述的解决方案,但这并不能保证它可用于所有注入@Value
。
我希望有一种与@Bean
可以设置属性值的方法类似的机制,但我在任何地方都看不到。
解决方案
可以通过多种方式在 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");
推荐阅读
- php - 如何在 Google Calendar API PHP 中每 2 天/周/月/年创建一次重复事件
- xcode - Xcode 的“分支”master 是一个不正确的项目
- azure - 来宾用户使用 Azure AD 登录我的应用程序
- php - 如何在特定条件下在表格上添加特定的编辑按钮?
- php - PHP 输出缓冲打印在脚本末尾
- php - 如何在 amCharts 中更改甘特图的高度?
- python - 使 Python Gensim 搜索功能高效
- xml - 使用 Symfony 4 反序列化多个嵌套实体
- c++ - 调用布尔函数但收到错误“没有要调用的匹配函数”?
- abaqus - 如何在abaqus上将两个不同的部分分配给单个零件