【问题标题】:Spring reference a property from a property beanSpring从属性bean中引用一个属性
【发布时间】:2012-12-24 23:34:41
【问题描述】:

我已经创建了一个运行良好的spring配置文件。

我的下一步是将用户配置属性与系统属性分开。

我决定使用将由用户配置的 bean 创建额外的 xml 文件。

我在创建几个这样的逻辑 bean 来封装真正的类 bean 将使用的属性时遇到了问题:

我在网上找到了一个以这种方式引用礼仪的选项:

UserConf.xml

<bean id="numberGuess" class="x...">
    <property name="randomNumber" value="5"/>

    <!-- other properties -->
</bean>

SystemConf.xml

<import resource="UserConf.xml" />

<bean id="shapeGuess" class="y...">
    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>

    <!-- other properties -->
</bean>

但我的问题是我需要 x... 类是逻辑上不应该被初始化的东西,我不希望它泄露系统的类层次结构的任何信息,因为它应该只是正在使用的配置xml文件。

解决方案 1 是创建一个表示此属性的 Java 对象:

public class MyProps(...)

并在spring系统配置中添加一个bean parent:

<bean id="MyProps" class="path to MyProps"/>

在用户端将之前的bean改成:

<bean id="numberGuess" parent="MyProps">
    <property name="randomNumber" value="5"/>

    <!-- other properties -->
</bean>

解决方案2就是像Database.props一样使用平面配置文件,使用工厂加载。

Solution3 是使用 Spring Property Placeholder 配置从 XML 属性文件(例如example)加载属性,但是这里我根本不知道如何获得更复杂的属性嵌套结构(属性需要用不同的逻辑名隔开,例如 minNumber 会在 xAlgo 和 y algo 下都定义)。

我不喜欢创建新的 Java 类只是为了处理这个问题或将我的用户配置移动到平面 props 文件(我需要 xml 结构),他们还有其他解决方案吗??

【问题讨论】:

  • “x”类的属性会用到哪里?
  • 抱歉,我不清楚为什么你不能只使用属性文件?
  • @cowls: 在 SystemConf 文件的不同 bean 中,
  • @Tom McIntyre:我只给出了一个简单的属性示例,我的部分属性和 bean 可能并且将会具有复杂的 XML 结构
  • @cowls:我已经添加了解决方案 3,如果我能够将属性分离到不同的逻辑部分,则更可取

标签: java spring dependency-properties


【解决方案1】:

首先,如果您不了解property place holder,您应该看一下。 @Value("${some.property:defaultvalue}") 也是你应该看的东西。

第二个词配置在Spring中是模棱两可的。 Spring 使用这个词,但它们的意思是开发人员配置而不是用户配置。不管人们怎么说或认为 Spring 不是一个配置引擎。

我不确定你想做什么,但你应该知道你的配置不会在运行时调整,这对于像“user”配置这样的东西来说是经常需要的。所以大部分人自己写配置层。

您应该注意的另一件事是不要使用 XML 配置,而是使用 Java Configuration,这将为您提供更大的灵活性。

【讨论】:

  • 我熟悉 Spring 的配置方面,网上的大部分链接都是使用 props 平面文件,我需要和示例属性占位符如何使用复杂的 xml 属性,类似于此链接 @987654323 @,但是有逻辑分离的属性块,你能提供一个例子或链接吗?
  • 当配置变得复杂(即嵌套)时,我使用 Jackson 或 JAXB 将配置文件反序列化为像 MyProps 这样的数据 POJO。 JSON 或 XML 文件配置为属性(系统属性或环境...等)的位置。
  • 没有其他办法解决吗?,是不是有一个可以在 XML 中定义的默认 bean,你可以在不使用占位符的情况下引用它的内部嵌套属性?
  • 嗯,是的,你可以基于一个属性做一个&lt;import...,但你仍然需要另一个像MyProps这样的bean。可以有另一个对象,因为它提供了一个间接层(软件设计的标志)。
  • 我找到了一个似乎更简单的解决方案,所以我在我的帖子中附上了答案,感谢您的帮助
【解决方案2】:

我会回答我自己的问题,因为它看起来对我来说是最好的解决方案(而且比建议的要简单得多)

我将使用 PropertiesFactoryBean 为我完成工作:

例如

UserConf.xml

<bean id="numberGuess" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="properties">
    <props>
        <prop key="randomNumber">3</prop>

    <!-- other properties -->
</bean>

SystemConf.xml

<import resource="UserConf.xml" />

<bean id="shapeGuess" class="y...">
    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>

    <!-- other properties -->
</bean>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多