我有一个字符串属性,类似于以下示例:
<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?或者,我是否还有其他最佳实践?
答案 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/>
都附带了name
和id
属性,以帮助您在配置中稍后引用这些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,它会在调试日志中导致几个异常。它有效,但似乎第一次尝试不起作用。