【问题标题】:Get Spring Environment as Properties获取 Spring 环境作为属性
【发布时间】:2015-01-30 15:30:04
【问题描述】:

我想知道是否有办法以 Properties 实例的形式从 Spring Environment 中提取属性(例如从 ApplicationContext 中获取)?或者,至少,有没有办法枚举 Spring Environment 中的属性,或者将它们全部作为地图获取,或者我可以将 [最初未知的] 一组属性转换为 Properties 对象的任何其他方式?

我需要这个来通过调用org.jclouds.ContextBuilder.newBuilder().overrides(Properties) 创建一个jclouds Context。这个想法是仅通过 .properties 文件来配置实际的云提供商,我不想将应用程序逻辑与提供商特定的属性结合起来。

[更新]

要使用的.properties 文件是使用<context:property-placeholder> 配置的,它实际上指定了一个路径列表,如下所示:

< context:property-placeholder location=
    "classpath:/jdbc.properties,
    file:${jboss.server.config.dir}/jdbc.properties,
    file:${catalina.home}/conf/jdbc.properties"
    ignore-resource-not-found="true"/>

这表明在提到的位置列表中按顺序搜索 .properties 文件。我想实现以下目标:

  • 仅在此 XML 定义文件中保留 .properties 文件及其可能位置的列表;
  • 允许将 jclouds 相关属性放置在 XML 中提到的 任何 .properties 文件中;
  • 以 Properties 对象的形式访问由 Spring 解析和加载的属性,以便我能够将其提供给 jclouds ContextBuilder

如果所有这些都可行,请告诉我。提前谢谢!

-弗拉德

【问题讨论】:

    标签: java spring spring-environment


    【解决方案1】:

    如果您不想在 Spring 配置中使用属性,那么您可以简单地使用:

    <context:property-placeholder location="classpath:foo.properties" />
    

    以后要在代码中获取属性,您可以简单地将这个文件从类路径读取到 Properties 对象中:

    props.load(MyClass.class.getClassLoader().getResourceAsStream("foo.properties"));
    

    您也可以查看PropertyPlaceholderConfigurer

    更新

    在 Deinum 的评论之后更新,但前提是您从 Spring 托管 bean 获取属性:

    <util:properties id="myProps" 
               location="classpath:foo.properties"/>
    <context:property-placeholder properties-ref="myProps" />
    

    现在您可以将 myProps 注入 Spring 托管 bean(无需从类路径再次加载它们)。

    【讨论】:

    • 为什么这么“复杂”。您可以简单地使用&lt;util:properties /&gt; 来读取属性,这些属性也可以注入到&lt;context:property-placeholder /&gt; 元素中。节省您两次加载文件的时间。
    • Deinum,你是对的,但这仅适用于 Spring 托管 bean。由于 OP 似乎正在自己创建这个对象(newBuilder()),这将不起作用。
    • 他需要那些应该被注入的属性,它们如何被读取并不重要。恕我直言,阅读应该是外化的。
    • 他将如何将它们注入到他自己创建的对象中?我没有假设他是从 Spring 托管的 bean 中执行此操作的。我的回答中没有具体化什么?
    • @M.Deinum,是否可以将位置列表指定给&lt;util:properties /&gt;
    【解决方案2】:

    您可以使用PropertiesFactoryBean 并执行以下操作:

    <bean id="jcloudsProps" 
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
      <property name="location">
        <value>your/props/file.properties</value>
      </property>
    </bean>
    

    然后您可以像使用任何其他 Spring bean 一样使用 jcloudsProps

    【讨论】:

    • 是否可以将此 bean 引用到现有的 &lt;util:properties/&gt; 元素?另外,您可以为位置指定多个值是真的吗?
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2015-10-22
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多