2010-10-18 77 views
3

我有一个字符串属性,它看起来类似于下面的例子:是否可以在Spring中别名bean类名?

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

长的类名(S)的影响可读性&还可以创建一个重构的开销。

是否可以为类名别名并使用短名称来声明bean?还是有一个我错过的替代最佳做法?

+0

感谢您对在bean和ref元素上使用id属性组合的建议。我确实使用这个,但是我希望找到一种方法来清理bean声明本身。 – Trastle 2010-10-18 22:39:25

回答

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

为什么不宣布这些内部bean作为单独的顶级咖啡豆用自己的名字,然后在列表中引用它们?

+0

感谢Brian,我在一些地方这样做了,我应该将它包含在示例中。我希望有一种方法来清理自己的bean定义。我不希望在XML文件中使用类名40次。 – Trastle 2010-10-18 22:41:39

1

您可能会尝试以某种简短形式表示您的映射,然后将其转换为FieldMapping s的列表。例如,来自您的代码片段的映射可能会被表示为一张地图。

作为一个理论练习在春季3,你可以用Spring Expression Language做到这一点(如果FieldMapping有apropriate构造函数):

<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采取短表您的映射数据(例如,地图,如本例),并返回FieldMapping秒的配置列表:

<property name = "mappingData"> 
    <bean class = "FieldMappingListFactoryBean"> 
     <property name = "mappings"> 
      <map> 
       <entry name = "entitlement.user" value = "DocUsers" /> 
       <entry name = "entitlement.contributor" value = "DocContributors" /> 
      </map> 
     </property> 
    </bean> 
</property> 

但是,如果你的字段映射是某种可重复使用的DSL,您可以尝试TH关于实施namespace extension的墨水。

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

我找到了一种方法来模拟类似于“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> 

这具有使用也可以用它的东西,你真正需要的类名的利益,而不能引用对象的实例:如果我使用PropertyP

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

laceholderConfigurer会导致调试日志中有几个例外。它的工作原理,但它似乎不起作用的第一次尝试。

相关问题