参数化的Spring bean配置

时间:2018-08-14 13:03:18

标签: java spring

我有一个层次的bean:

<bean id="a">
  <property name="config" value="something"/>
</bean>

<bean id="b">
  <property name="a" ref="a"/>
</bean>

<bean id="c">
  <property name="b" ref="b"/>
</bean>

<bean id="d">
  <property name="c" ref="c"/>
</bean>

一切正常。但是,假设我现在需要一个替代层次结构,其中需要更改最深bean(在这种情况下为a.config)上的某些内容。为了连接所有内容,我现在需要将整个层次结构加倍,即:

<bean id="a2">
  <property name="config" value="something2"/>
</bean>

<bean id="b2">
  <property name="a" ref="a2"/>
</bean>

<bean id="c2">
  <property name="b" ref="b2"/>
</bean>

<bean id="d2">
  <property name="c" ref="c2"/>
</bean>

我知道两种解决方法:

  • 使用属性,即类似这样的

    <bean id="a">
      <property name="config" value="${a.config}"/>
    </bean>
    
  • 使用全局bean并覆盖它们,即

    <bean id="a.config">
      <constructor-arg value="something"/>
    </bean>
    
    <bean id="a">
      <property name="config" ref="a.config"/>
    </bean>
    
    <!-- Override in another xml file -->
    <bean id="a.config">
      <constructor-arg value="something2"/>
    </bean>
    

缺点:

  • 属性仅允许简单的值更改。例如。如果它们的属性不同,则无法更改实例化的bean的类
  • 覆盖是不确定性的,没有人愿意调试与不确定性Spring实例化相关的问题

还有其他更容易管理的方法,可以通过某种方式传递参数吗?

从逻辑上讲,我正在遵循以下原则:

<bean id="a">
  <property name="config" ref-param="a-config"/>
</bean>

<bean id="b">
  <property name="a" ref="a"/>
</bean>

<bean id="c">
  <property name="b" ref="b"/>
</bean>

<bean id="d">
  <property name="c" ref="c"/>
  <param name="a-config" value="something"/>
</bean>

<bean id="d2">
  <property name="c" ref="c"/>
  <param name="a-config" value="something2"/>
</bean>

0 个答案:

没有答案