2013-01-10 203 views
3

我创建了一个运行良好的spring配置文件。Spring引用属性bean的属性

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

我已决定创建额外的xml文件,这些文件将由用户配置。

我有问题创造一些这样的逻辑封装豆性质将由真正的类的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(...) 

,并在弹簧系统配置中添加一个bean父:

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

在用户一侧的改变以前豆成为:

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

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

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

Solution3是利用弹簧特性占位符的配置从XML属性加载属性文件(如example),但在这里,我根本不知道如何获得属性的更复杂的嵌套结构(属性需要分开通过不同的逻辑名称,例如minNumber将在xAlgo和y算法下定义)。

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

+0

凡将在 “X” 级的属性可以用吗? – cowls

+0

对不起,我不清楚为什么你不能只使用属性文件? –

+0

@cowls:在SystemConf文件的不同bean中, – Michael

回答

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> 
1

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

第二个字配置在Spring中不明确。 Spring使用这个词,但它们表示开发人员配置而不是用户配置。尽管人们说或认为Spring不是配置引擎。

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

你应该看看的另一件事是不使用XML配置,而是使用Java Configuration,这会给你更多的灵活性。

+0

我熟悉Spring的配置方面,Web上的大多数链接都是用于使用道具平面文件,我需要和例如属性占位符如何使用复杂的XML属性,类似于此链接http://rvsoni.wordpress.com/2012/03/15/spring-property-placeholder-configuration-to-load-properties-from-xml-properties-file/,但逻辑上分开的属性块,你能提供一个例子或链接? – Michael

+0

当配置变得复杂时(即嵌套),我使用Jackson或JAXB将配置文件反序列化为像MyProps这样的数据POJO。 JSON或XML文件配置为属性(系统属性或环境等)。 –

+0

没有其他解决方法吗?是不是有一个默认的bean可以在XML中定义,并且您可以在不使用占位符的情况下引用其内部嵌套属性? – Michael