4

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

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

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

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

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

用户配置文件

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

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

系统配置文件

<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一样使用平面配置文件,并使用工厂加载它。

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

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

4

2 回答 2

3

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

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

例如

用户配置文件

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

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

系统配置文件

<import resource="UserConf.xml" />

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

    <!-- other properties -->
</bean>
于 2013-01-10T15:49:26.147 回答
1

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

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

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

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

于 2013-01-10T14:59:50.467 回答