问题标签 [spring-environment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
828 浏览

spring - PropertySourcesPropertyResolver 中的属性源顺序

这是我的配置类的一部分:

问题是它也SystemEnvironmentPropertySource包含“用户名”属性,并且它之前得到处理ResourcePropertySource,基于我的属性文件,因为 propertySources 列表顺序。因此加载了“用户名”属性的错误值。在系统环境属性之前获取文件中要处理的属性的方法是什么?

0 投票
2 回答
11915 浏览

spring - 使用常量解析属性时如何在@Value中使用Spring-EL

我正在尝试使用常量来定义属性,然后使用 @Value 注释来解析它。

我在接口中定义了常量:

我正在使用 springboot,并将该属性作为默认属性添加到上下文中:

现在,我想使用@Value 将字符串“MyStartableJob”注入到字符串中。但不是直接使用@Value(value="${javabatch.jobName}),我想使用定义的常量。

我试过了

但当然,这仅解析为“javabatch.jobName”,而不解析为名为“javabatch.jobName”的属性的值。

所以我试图将它包装在 中@Value(value="${#{T(ch.mobi.javabatch.core.internal.InternalConstants).JOB_NAME_PROPERTY}}"),但这会导致异常。

我知道,我可以简单地注入 Environment 并使用它的 getProperty 方法:

这有效并符合我的目的。但我想知道,这是否也可以在@Value 中使用 SPEL 来完成。

谢谢。

0 投票
2 回答
420 浏览

java - @PropertySource 和应用程序上下文名称

我有一个@Configuration 类。这个类有一个@PropertySource。

我希望每个应用程序都有一个不同的属性。

例子:

我想通过上下文名称为每个应用程序配置每个属性。

我的应用服务器目录结构:

两者(my-app-a.war 和 my-app-b.war)都是同一个 Web 应用程序,不同之处在于它们在不同的上下文中部署了两次。

出于这个原因,我需要配置这两个属性:

如何创建自定义属性源解析器以注入/考虑应用程序上下文名称以加载属性文件?

0 投票
1 回答
1027 浏览

java - 重新加载弹簧豆,不包括一些豆子

我希望能够定期检查一些属性文件并相应地在我的应用程序中应用更改。

在我的 java-spring 应用程序中,我定期检查从文件系统加载的属性文件是否已更改:

万一它发生了变化,我想重新加载我的spring bean,因为其中一些实际上是根据属性文件中的属性值有条件地加载的。

使用refresh方法并没有解决问题,所以我实际上是在调用close方法并重新创建我的上下文:

这可以解决问题。我的问题是我有一些包含缓存数据的 bean,我不想丢失这些数据。一种解决方案是继续使用此方法,但确保我的缓存数据驻留在不受 spring 管理的类中(静态或由我管理的单例)。

另一种解决方案可能是在重新创建上下文之前复制我的缓存数据,然后将其设置回新创建的 bean(那些保存缓存数据的 bean),但这感觉非常难看。

有更好的方法吗?

0 投票
2 回答
3087 浏览

spring-boot - Spring Boot 在配置代码中获取命令行参数

我通过 Spring 批处理项目获得了 Spring Boot。在我的 BatchConfiguration 中,我想获取命令行参数,所以我 @Autowire Environment 对象并尝试获取我的道具,但我得到了空值。

经过一些调试后,我发现我可以通过特殊属性名称“nonOptionArgs”获取所有命令行参数,但在这种情况下,我得到了所有参数的纯字符串。有更好的解决方案吗?

谢谢

0 投票
1 回答
483 浏览

java - 将值设置/放入 Spring-boot 的 Spring 环境中以供以后使用

有没有办法设置或放入一些值org.springframework.core.env.Environment

我们正在使用以下版本的 Spring-boot。

Spring 将application.properties默认加载org.springframework.core.env.Environment。我们可以通过@Autowired Environment 和 getString("key") 来获取值。

假设我们有一个许可文件,并将对其进行解码以加载许可期限,以验证该系统是否仍然有效,initialize()ApplicationContextInitializer.

我们想将此许可期限保存到Environment以后使用。例如,当用户每次发送一些指定的请求时,我们将再次验证许可期限。这样,我们就不必每次都加载许可证文件并对其进行解码。

或者我们可以用其他更合适的方式来达到这个目的吗?

任何帮助表示赞赏。

0 投票
7 回答
49688 浏览

java - 动态注入spring bean

在 java-spring web-app 中,我希望能够动态注入 bean。例如,我有一个具有 2 个不同实现的接口:

在此处输入图像描述

在我的应用程序中,我使用一些属性文件来配置注入:

我的注入实际上是根据属性文件中的属性值有条件地加载的。例如,在这种情况下 myinterface.type=implA 无论我在哪里注入 MyInterface ,将被注入的实现将是 ImplA (我通过扩展Conditional annotation实现了这一点)。

我希望在运行时 - 一旦更改属性,将发生以下情况(无需重新启动服务器):

  1. 将注入正确的实现。例如,当设置myinterface.type=implBImplB 将被注入到任何使用 MyInterface 的地方
  2. Spring Environment应该使用新值刷新并重新注入到 bean 中。

我想刷新我的上下文,但这会产生问题。我想也许可以使用设置器进行注入,并在重新配置属性后重新使用这些设置器。有这种要求的工作实践吗?

有任何想法吗?

更新

正如一些人建议的那样,我可以使用一个工厂/注册表,它包含两种实现(ImplA 和 ImplB)并通过查询相关属性返回正确的。如果我这样做了,我还有第二个挑战——环境。例如,如果我的注册表如下所示:

一旦属性发生变化,我应该重新注入我的环境。有什么建议吗?

我知道我可以在方法而不是构造函数中查询该环境,但这会降低性能,而且我想考虑一个用于重新注入环境的 ider(再次,也许使用 setter 注入?)。

0 投票
1 回答
68 浏览

spring - Spring enviroment.getProperty() 每次都会访问文件还是会记住?

我有一个 Spring MVC 应用程序。我正在使用someprops.property文件来获取一些全局属性。

我正在使用 Spring 的 Environment 来获得这个。

在某种方法

我的问题是,它会在程序每次调用 env.getProperty() 时读取文件,还是会记住最后访问的道具并从中返回。

0 投票
1 回答
434 浏览

java - 使用 spring 加载一个文本文件,其位置定义为 spring el

在 spring 基础项目中,我们要从classpath文件位置加载文件,必须从spring el表达式进行评估。

此功能目前在加载属性文件的 spring 中,位置可以是任何Spring EL.

这正是我们想要的,但不是加载属性文件,只是一个文本文件。

所以我们在下面尝试:

我们用ResourceLoader

怎么resourceLoader.getResource("classpath:/conf/#{environment.getActiveProfiles()[1]}}/sample.txt")也行不通。

似乎resourceLoader.getResource没有解析 Spring EL。

虽然我们可以解析 EL,然后从资源加载器中获取文件,但我们想知道是否可以更轻松地完成,可能使用一些内置函数。

0 投票
2 回答
320 浏览

java - 将 applicationConfig PropertySource 添加到新环境

我目前正在将现有应用程序迁移到 Spring Boot 1.2(使用 Mule 3;与 Spring 4.2 不兼容)。这个应用程序包含一个库提供的(我无法修改)servlet,它通过读取一些包含 bean 定义的应用程序包含的 XML 文件来创建几个 ClasspathXmlApplicationContexts 来执行 Mule 引导过程。

我的问题是这个 XML 文件包含几个占位符,应该根据活动配置文件以不同的方式解析(我已经将这些变量存储在 application.yml 文件中,具有不同的配置文件),但是 applicationConfig PropertySource 在由新应用程序上下文创建的标准环境。

我可以将 YML 文件转换为 .properties 文件并在每个 XML 文件中创建一个新的 PropertyPlaceholderConfigurer,指向相同的应用程序-#{systemProperties['spring.profiles.active']}.properties,但是:

  1. 我会失去 Boot 使用约定和优先级将 .properties 文件定位在不同内部/外部位置的灵活性,这对于要在不同环境中迁移的应用程序来说听起来很方便。

  2. 如果我需要多次添加相同的定义,我想有一种我忽略的编程方式。

有谁知道我如何将 applicationConfig PropertySource 的内容添加到所有新创建的 ApplicationContexts 中而无需修改创建它们的类?Spring Boot 1.2 没有 EnvironmentPostProcessor 的强大功能。