繁体   English   中英

Spring引用属性bean的属性

[英]Spring reference a property from a property bean

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

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

我已决定使用将由用户配置的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属性文件加载属性( 例如 ),但在这里我根本不知道如何获得更复杂的嵌套结构属性(属性需要用不同的逻辑名分隔,例如minNumber将在xAlgo和y算法下定义。

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

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

我将使用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>

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM