【问题标题】:Switching between property files dynamically by changing environment name in Spring通过在 Spring 中更改环境名称在属性文件之间动态切换
【发布时间】:2014-01-10 07:22:38
【问题描述】:

我想知道是否有任何方法可以动态设置环境变量的值而无需重新启动服务器,以便可以根据当前设置的环境值访问不同的属性文件。

考虑一下这是我的两个属性文件:

config-dev.properties
config-prod.properties

现在由于我已经在每个文件中附加了环境名称,所以我想知道我是否可以动态更改或设置环境名称的值,并且在不重新启动服务器的情况下将使用相应的属性文件。

我知道如何在配置 XML 文件中设置 env.name

<context:property-placeholder location="classpath:/config-${env.name}.properties>

我想以编程方式更改环境名称,以便在访问时可以使用正确的属性文件。

【问题讨论】:

  • @Hrishikesh 我的问题是我只需要这样做而不需要重新启动应用程序或服务器。
  • 所以你对 Prod 和 DEv 使用相同的服务器?
  • 是的,实际上我正在尝试将其部署在云(Google App Engine)上,所以通常我无法在那里设置多个服务器。
  • 你可以重新加载 spring 上下文,但我不确定这个 prod 是否也是 dev 是个好主意(请参阅stackoverflow.com/questions/534030/…

标签: java spring jakarta-ee spring-mvc environment-variables


【解决方案1】:

&lt;context:property-placeholder location="classpath:/config-${env.name}.properties&gt; 是一种方法。其中您的 env.name 是运行配置,可以是您设置的启动参数。

另一种方法是使用 Spring bean Profile。在哪里定义配置文件,为这些配置文件定义的 bean 将在 Spring 容器启动期间加载。

<beans profile="dev">
    <bean .... />
<context:property-placeholder
    location="classpath:conf/properties/dev.properties" />
</beans>

<beans profile="prod">
    <bean .... />
<context:property-placeholder
    location="classpath:conf/properties/prod.properties" />
</beans>

我不确定是否在不重新启动服务器的情况下更改它。因为您的 Spring 容器已经启动,并且 bean 已经加载。现在您确实想在不重新启动 Spring 容器的情况下加载一组不同的 bean。我不确定。

在我看来,这样做的基本原因是,如何在运行时更改已经自动装配的依赖项而不影响任何其他正在运行的应用程序类?正在执行的功能如何,您想通过属性文件中的开关更改 DB URL?你是怎么控制的?

【讨论】:

  • 我不愿意重新启动自动装配的依赖项和 bean,而是我想更改唯一要使用的属性文件,因为该属性文件可能有一个用于 paypal 集成 URL 的参数,因此 paypal 提供沙盒模式为生产模式,所以我需要通过切换属性文件名或更改环境变量名来动态切换这些模式。
  • 我很清楚这一点
猜你喜欢
相关资源
最近更新 更多
热门标签