Возможно ли псевдонимы имен классов бинов в Spring? - PullRequest
3 голосов
/ 19 октября 2010

У меня есть строковое свойство, похожее на следующий пример:

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

Длинные имена классов влияют на читаемость, а также создают затраты на рефакторинг.

Возможно ли псевдоним имени класса и использовать короткое имя для объявления bean-компонентов?Или я пропускаю альтернативную лучшую практику?

Ответы [ 6 ]

2 голосов
/ 14 сентября 2011

Возможно, немного поздно для вас, но, надеюсь, полезно для других:

Для этого вы можете использовать родительские бины. Сначала объявите родительский компонент в качестве шаблона:

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

Обратите внимание, мое соглашение здесь заключается в том, чтобы использовать идентификаторы верхнего регистра здесь для родительских шаблонных компонентов.

1 голос
/ 10 декабря 2011

Я нашел способ имитировать эффект, похожий на «import com.Foo;» в коде Java. Лучший вариант, который я мог найти, - это использовать PropertyPlaceholderConfigurer с определенными локальными свойствами. Используя ваш пример, вот конфигурация, которую вы поместите в верхнюю часть вашего весеннего конфигурационного файла, чтобы определить свойство "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>

Затем вы можете использовать это свойство в своих бобах:

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

Это имеет то преимущество, что use может также использовать его для вещей, где вам действительно нужно имя класса, и не может ссылаться на экземпляр объекта:

<util:constant static-field="${class_FieldMapping}.MYSTATICVAR" />
1 голос
/ 19 октября 2010

Вы можете попытаться представить ваше отображение в некоторой краткой форме, а затем преобразовать его в список FieldMapping s.Например, сопоставления из вашего фрагмента могут быть представлены в виде карты.

В качестве теоретического упражнения в 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, чтобы получить краткую форму ваших картографических данных (например, карту, как в этомпример) и возвращает настроенный список FieldMapping s:

<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 многократного использования, вы можете попытаться подумать о реализации расширения пространства имен .

1 голос
/ 19 октября 2010

каждый <bean/> поставляется с атрибутом name и id, чтобы помочь вам ссылаться на эти компоненты позже в вашей конфигурации.

Я бы предложил использовать id для объявления компонента.

ваш конфиг может выглядеть так:

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

<list>
   <ref>fooBean</ref>
   <ref>barBean</ref>
</list>
0 голосов
/ 07 октября 2014

Если я использую PropertyPlaceholderConfigurer, это приводит к нескольким исключениям в журнале отладки.Это работает, но кажется, что это не работает с первой попытки.

0 голосов
/ 19 октября 2010

Почему бы не объявить эти внутренние bean-компоненты как отдельные bean-объекты верхнего уровня со своими именами, а затем ссылаться на них в списке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...