是否可以在Spring中使用别名bean类名?

时间:2010-10-18 22:08:13

标签: spring syntax

我有一个字符串属性,类似于以下示例:

<property name="mappingData">
  <list>                
    <bean class="com.company.product.longNamingStandard.migration.extractor.FieldMapping">
      <property name="elementName" value="entitlement.user"/>
      <property name="mapping" value="DocUsers"/>
    </bean>
    <bean class="com.company.product.longNamingStandard.migration.extractor.FieldMapping">
      <property name="elementName" value="entitlement.contributor"/>
      <property name="mapping" value="DocContributors"/>
    </bean>
  </list>
</property>  

长级名称效果可读性&amp;还会产生重构开销。

是否可以为类名设置别名并使用短名称来声明bean?或者,我是否还有其他最佳实践?

6 个答案:

答案 0 :(得分:2)

对你来说可能有点晚了,但希望对其他人有用:

您可以使用父bean来完成此任务。 首先将父bean声明为模板:

<bean id="FieldMapping" class="com.company.product.longNamingStandard.migration.extractor.FieldMapping"/>

然后使用parent属性在别处使用它。

<property name="mappingData">
  <list>                
    <bean parent="FieldMapping">
      <property name="elementName" value="entitlement.user"/>
      <property name="mapping" value="DocUsers"/>
    </bean>
    <bean parent="FieldMapping">
      <property name="elementName" value="entitlement.contributor"/>
      <property name="mapping" value="DocContributors"/>
    </bean>
  </list>
</property>

请注意我的惯例是在这里使用大写字母ID作为父模板bean。

答案 1 :(得分:1)

每个<bean/>都附带了nameid属性,以帮助您在配置中稍后引用这些bean。

我建议使用id来声明bean。

您的配置可能如下所示:

<bean id="fooBean" class="com.example.foo"/>
<bean id="barBean" class="com.example.bar"/>

<list>
   <ref>fooBean</ref>
   <ref>barBean</ref>
</list>

答案 2 :(得分:1)

您可以尝试以某种简短形式表示您的映射,然后将其转换为FieldMapping的列表。例如,您的代码段中的映射可以表示为地图。

作为Spring 3的理论练习,您可以使用Spring Expression Language(如果FieldMapping具有适当的构造函数)执行此操作:

<util:map id = "m">
    <entry name = "entitlement.user" value = "DocUsers" />
    <entry name = "entitlement.contributor" value = "DocContributors" />
</util:map>
...
<property name = "mappingData" 
    value = "#{m.![new com.company.product.longNamingStandard.migration.extractor.FieldMapping(key, value)]}" />

如果此表达式过于模糊,您可以实现FactoryBean来获取映射数据的简短形式(例如,映射,如本例所示)并返回{{1}的已配置列表} S:

FieldMapping

但是,如果您的字段映射是某种可重用的DSL,您可以尝试考虑实现namespace extension

答案 3 :(得分:1)

我找到了一种模拟类似于“import com.Foo”的效果的方法。在java代码中。我能找到的最佳选择是使用PropertyPlaceholderConfigurer并定义了本地属性。使用您的示例,这是您将放在spring配置文件顶部的配置,以定义“class_FieldMapping”属性:

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <description>Define properties equivalent to "import foo;" in java source</description>
    <property name="properties">
        <props>
            <prop key="class_FieldMapping">com.company.product.longNamingStandard.migration.extractor.FieldMapping</prop>
        </props>
    </property>
</bean>

然后,您可以在bean中使用该属性:

<property name="mappingData">
  <list>                
    <bean class="${class_FieldMapping}">
      ...
    </bean>
    <bean class="${class_FieldMapping}">
      ...
    </bean>
  </list>
</property>

这样做的好处是,use也可以用于实际需要类名的东西,并且不能引用对象的实例:

<util:constant static-field="${class_FieldMapping}.MYSTATICVAR" />

答案 4 :(得分:0)

为什么不将这些内部bean声明为具有自己名称的单独顶级bean,然后在列表中引用它们?

答案 5 :(得分:0)

如果我使用PropertyPlaceholderConfigurer,它会在调试日志中导致几个异常。它有效,但似乎第一次尝试不起作用。