Как уменьшить дублирование в контексте приложения Spring - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть несколько бинов, которые я создаю, и все они используют похожий шаблон для создания бинов. Все верхние объекты очень похожи, но содержащиеся в них объекты отличаются аргументами строкового конструктора. Все в каждом компоненте верхнего уровня одинаковы, за исключением двух экземпляров THIS CHANGES A и одного экземпляра THIS CHANGES B. Ниже один из моих бобов. Остальные точно такие же, за исключением значений THIS CHANGES.

<bean id="mover1" class="CustomDataMover">
        <constructor-arg ref="session"/>
        <constructor-arg>
            <bean class="DataCache">
                <constructor-arg>
                    <bean class="AllValuesReader">
                        <constructor-arg ref="databaseConnector"/>
                        <constructor-arg value="THIS CHANGES A"/>
                        <constructor-arg value="v1"/>
                        <constructor-arg value="v2"/>
                    </bean>
                </constructor-arg>
            </bean>
        </constructor-arg>
        <constructor-arg ref="customUpdate"/>
        <constructor-arg value="THIS CHANGES B"/>
        <constructor-arg>
            <bean class="ValueGenerator">
                <constructor-arg>
                    <bean class="LatestValueRetriever">
                        <constructor-arg ref="databaseConnector"/>
                        <constructor-arg value="v3"/>
                        <constructor-arg value="v4"/>
                        <constructor-arg value="THIS CHANGES A"/>
                    </bean>
                </constructor-arg>
            </bean>
        </constructor-arg>
</bean>

Как я могу уменьшить количество дублирования в моих бобах? Я ищу способ сделать какой-то шаблон. Также обратите внимание, что у меня есть ссылки на другие бины.

1 Ответ

5 голосов
/ 16 февраля 2012

Вы можете использовать абстрактные определения bean-компонентов в качестве шаблонов, чтобы уменьшить дублирование. Например:

<bean id="parent" abstract="true">
    <constructor-arg value="ARG0"/>

    <property name="propertyA" value="A"/>
    <property name="propertyB" value="B"/>
    <property name="propertyC" ref="beanC"/>
</bean>

<bean id="child1" class="SomeClass" parent="parent">
    <property name="propertyD" value="D1"/>
</bean>

<bean id="child2" class="SomeOtherClass" parent="parent">
    <property name="propertyD" value="D2"/>
</bean>

Бины "child1" и "child2" будут совместно использовать значения из "parent" для arg0, "propertyA", "propertyB" и "propertyC" и все еще смогут настраивать свои собственные значения для "propertyD".

Обратите внимание, что у "parent" нет класса, и, следовательно, его нельзя создать. Также обратите внимание, что «child1» и «child2» могут быть потомками одного и того же определения абстрактного компонента, будучи совершенно разными классами - эта иерархия не имеет ничего общего с иерархией классов.

...