Spring引用属性bean的属性

时间:2013-01-10 14:37:20

标签: java spring dependency-properties

我创建了一个运行良好的弹簧配置文件。

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

我决定使用将由用户配置的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文件。

Solution1 是创建一个代表这些属性的Java对象:

public class MyProps(...)

并在spring系统配置中添加bean父级:

<bean id="MyProps" class="path to MyProps"/>
在用户端

将以前的bean更改为:

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

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

Solution2 就像使用Database.props一样使用平面配置文件,并使用工厂加载它。

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

我不喜欢创建新的Java类来处理这个问题或者将我的用户配置移动到一个扁平的道具文件(我需要xml结构),是他们的任何其他解决方案吗?

2 个答案:

答案 0 :(得分:3)

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

我将使用PropertiesFactoryBean为我做的工作:

e.g。

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>

答案 1 :(得分:1)

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

其次,配置这个词在Spring中是不明确的。 Spring使用这个词但它们意味着开发人员配置而不是用户配置。尽管人们说或者认为Spring不是配置引擎。

我不确定您尝试做什么但是您应该知道您的配置不会在运行时进行调整,这通常需要“ user ”配置。所以大多数人都会编写自己的配置层。

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