Spring 系统 属性 解析器定制:
Spring System Property Resolver Customization:
我正在从事一个项目,该项目要求我在 java spring 应用程序中获取环境变量或系统属性,并在将它们注入 bean 之前对其进行修改。修改步骤是此应用程序正常工作的关键。
我目前的做法是将变量设置为系统环境变量,然后使用自定义占位符配置器访问上述变量并从中创建 bean 可以访问的新属性。有a perfect tutorial for this(除了它使用数据库)。
我有一个使用这种方法的 POC 工作正常,但我认为可能有更简单的解决方案。也许有一种方法可以将默认占位符配置器扩展到 "hook in" 自定义代码,以便对整个应用程序中的所有属性进行必要的修改。也许有一种方法可以在收集属性之后和将数据注入 bean 之前立即 运行 编码。
spring 是否提供更简单的方法来执行此操作?
感谢您的宝贵时间
简而言之,完成此操作的最简单方法是按照 spring documentation for property management.
部分 "Manipulating property sources in a web application" 下的说明进行操作
最后,您通过上下文参数标记从 web.xml 引用自定义 class:
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.some.something.PropertyResolver</param-value>
</context-param>
这会强制 spring 在初始化任何 bean 之前加载此代码。然后你的 class 可以做这样的事情:
public class PropertyResolver implements ApplicationContextInitializer<ConfigurableWebApplicationContext>{
@Override
public void initialize(ConfigurableWebApplicationContext ctx) {
Map<String, Object> modifiedValues = new HashMap<>();
MutablePropertySources propertySources = ctx.getEnvironment().getPropertySources();
propertySources.forEach(propertySource -> {
String propertySourceName = propertySource.getName();
if (propertySource instanceof MapPropertySource) {
Arrays.stream(((EnumerablePropertySource) propertySource).getPropertyNames())
.forEach(propName -> {
String propValue = (String) propertySource.getProperty(propName);
// do something
});
}
});
}
}
我正在从事一个项目,该项目要求我在 java spring 应用程序中获取环境变量或系统属性,并在将它们注入 bean 之前对其进行修改。修改步骤是此应用程序正常工作的关键。
我目前的做法是将变量设置为系统环境变量,然后使用自定义占位符配置器访问上述变量并从中创建 bean 可以访问的新属性。有a perfect tutorial for this(除了它使用数据库)。
我有一个使用这种方法的 POC 工作正常,但我认为可能有更简单的解决方案。也许有一种方法可以将默认占位符配置器扩展到 "hook in" 自定义代码,以便对整个应用程序中的所有属性进行必要的修改。也许有一种方法可以在收集属性之后和将数据注入 bean 之前立即 运行 编码。
spring 是否提供更简单的方法来执行此操作? 感谢您的宝贵时间
简而言之,完成此操作的最简单方法是按照 spring documentation for property management.
部分 "Manipulating property sources in a web application" 下的说明进行操作最后,您通过上下文参数标记从 web.xml 引用自定义 class:
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.some.something.PropertyResolver</param-value>
</context-param>
这会强制 spring 在初始化任何 bean 之前加载此代码。然后你的 class 可以做这样的事情:
public class PropertyResolver implements ApplicationContextInitializer<ConfigurableWebApplicationContext>{
@Override
public void initialize(ConfigurableWebApplicationContext ctx) {
Map<String, Object> modifiedValues = new HashMap<>();
MutablePropertySources propertySources = ctx.getEnvironment().getPropertySources();
propertySources.forEach(propertySource -> {
String propertySourceName = propertySource.getName();
if (propertySource instanceof MapPropertySource) {
Arrays.stream(((EnumerablePropertySource) propertySource).getPropertyNames())
.forEach(propName -> {
String propValue = (String) propertySource.getProperty(propName);
// do something
});
}
});
}
}