【问题标题】:Use environment variable in Spring beans.xml在 Spring beans.xml 中使用环境变量
【发布时间】:2015-07-07 00:08:40
【问题描述】:

我有一个特殊的要求,即从系统环境变量中设置一些 bean 的值,这在 spring 中可能吗?

伪代码

<bean id="connectionFactory"
    class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="testhost" />
        <property name="username" value="$SystemEnv.RabbitUserName" />
        <property name="password" value="$SystemEnv.RabbitPassword" />
    </bean>

现在这些 RabbitUserName 和 RabbitPassword 被外部化在 .war 文件之外的某个环境变量中。

春天有什么优雅的方法可以达到同样的效果吗?

【问题讨论】:

标签: spring spring-4


【解决方案1】:

这应该可行。

<bean id="connectionFactory"
    class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="testhost" />
        <property name="username" value="#{systemProperties['RabbitUserName']}" />
        <property name="password" value="#{systemProperties['RabbitPassword']}" />
    </bean>

【讨论】:

    【解决方案2】:

    要获取系统环境变量,您可以将其用作值:

    #{ systemEnvironment['RabbitUserName'] }
    

    另一个答案中提到的#{ systemProperties['RabbitUserName'] } 不会为您提供系统环境变量,而是会读取 Java 系统属性,即您可以在启动 JVM 时在命令行上设置的那些内容,例如:

    java -DRabbitUserName="reisen" etc...
    

    但是,与环境变量相比,这可能是连接凭据位置的更好选择,例如,您可以针对不同的启动配置对其进行不同的配置,并且它的暴露程度也略低于环境值 - 这所有其他应用程序也具有完全可见性。

    有关环境变量和系统属性之间差异的更多信息,请参阅Java system properties and environment variables

    这些是 Spring 表达式语言 (SpEL) 的示例,您还可以将其与注释元数据一起使用,例如

    @Value("#{ systemEnvironment['RabbitUserName'] }")
    

    有关 SpEL 的更多信息,您可以在此处查看 Spring 参考:https://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/expressions.html

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2017-12-26
      • 2017-09-06
      • 2021-09-29
      相关资源
      最近更新 更多