Статьи

Spring XML Hell? Escape XML Hell

Некоторые не любят настраивать внедрение зависимостей (DI) в XML. Они называют это «Ад XML»! Некоторые даже жалуются на конфигурацию Spring DI XML из-за отсутствия безопасности типов.

Однако по сравнению с J2EE XML-конфигурацией (и многими другими фреймворками), Spring XML-конфигурация очень проста и эффективна. В дополнение к аннотациям Spring 2.5 и модулю Spring Java Config вам не нужно использовать XML для создания DI.

 

Например, JSF обеспечивает поддержку XML DI. Однако конфигурация JSF в текущей версии может быть очень многословной. Spring может немного упростить создание DI с JSF. Давайте рассмотрим это как пример JSF, а затем покажем, как избежать «ада XML», используя Spring XML, а затем модуль Spring Java Config.

 

Скажем в JSF, что у меня есть управляемый компонент, который действует как контроллер с именем ContactController, и у него есть три зависимости, которые нужно внедрить, с именами ContactRepository, GroupRepository и TagRepository. Кроме того, ContactValidators — это служебный класс, который мы используем для проверки. Чтобы сконфигурировать все это в стандартном XML JSF, мы должны сделать следующие подробные записи:

<managed-bean>
<managed-bean-name>contactValidators</managed-bean-name>
<managed-bean-class>com.arcmind.contact.validators.ContactValidators</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

<managed-bean>
<managed-bean-name>contactController</managed-bean-name>
<managed-bean-class>
com.arcmind.contact.controller.ContactController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>contactRepository</property-name>
<property-class>
com.arcmind.contact.model.ContactRepository
</property-class>
<value>#{contactRepository}</value>
</managed-property>
<managed-property>
<property-name>groupRepository</property-name>
<property-class>
com.arcmind.contact.model.GroupRepository
</property-class>
<value>#{groupRepository}</value>
</managed-property>
<managed-property>
<property-name>tagRepository</property-name>
<property-class>
com.arcmind.contact.model.TagRepository</property-class>
<value>#{tagRepository}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>contactRepository</managed-bean-name>
<managed-bean-class>
com.arcmind.contact.model.ContactRepository
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

<managed-bean>
<managed-bean-name>groupRepository</managed-bean-name>
<managed-bean-class>
com.arcmind.contact.model.GroupRepository
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

<managed-bean>
<managed-bean-name>tagRepository</managed-bean-name>
<managed-bean-class>
com.arcmind.contact.model.TagRepository
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

 

GAK! Версия конфигурации JSF занимает около 60 строк. Конечно, многие настраивают JSF только с помощью инструментов IDE, поэтому им может быть все равно, сколько времени это займет. Однако, если вы предпочитаете редактировать файлы, а не заполнять диалоговые окна IDE, как я, Spring может значительно упростить настройку XML DI. Spring XML намного удобнее для разработчиков. Уже одно это может заинтересовать Spring, если вы занимаетесь JSFdevelopment.


(Вы можете скачать полный пример из этого руководства JSF на сайте IBM developerWorks .)


Давайте посмотрим на краткую версию конфигурации Spring XML выше.

 

<bean id="contactValidators" class="com.arcmind.contact.validators.ContactValidators"/>

<bean id="contactController" class="com.arcmind.contact.controller.ContactController" scope="session">
<property name="tagRepository" ref="tagRepository"/>
<property name="groupRepository" ref="groupRepository"/>
<property name="contactRepository" ref="contactRepository"/>
</bean>

<bean id="contactRepository" class="com.arcmind.contact.model.ContactRepository"/>

<bean id="groupRepository" class="com.arcmind.contact.model.GroupRepository"/>

<bean id="tagRepository" class="com.arcmind.contact.model.TagRepository"/>

Теперь конфигурация XML имеет длину всего 11 строк, а не около 60. Это хорошее улучшение, но все же есть некоторые, кому не нравится работать с XML, даже если он составляет всего 1/6 размера версии XML JSF. (Обратите внимание, что вы можете сделать конфигурацию Spring XML DI более краткой, используя автоматическую разводку и другие методы, однако вышеприведенное является хорошим компромиссом для удобочитаемости.)


(Вы можете найти приведенный выше пример в разделе Архитектурные доказательства концепции: пример контактов 4 ).


Spring 2.5 предоставляет множество опций для настройки DI без использования большого количества XML. Spring 2.5 предоставляет поддержку аннотаций, аналогичную поддержке, которую предоставляют Seam и Guice, так что вы можете выполнять DI без написания большого количества XML. Менее разрекламированный проект из портфелей проектов Spring — проект Spring Java Configuration. Вот пример Spring Java Config следующим образом:

 

@Bean
public ContactValidators contactValidators() {
return new ContactValidators();
}

@Bean(scope=DefaultScopes.SESSION)
public ContactController contactController() {
ContactController contactController = new ContactController();
contactController.setContactRepository(contactRepository());
contactController.setTagRepository(tagRepository());
contactController.setGroupRepository(groupRepository());
return contactController;
}

@Bean
public ContactRepository contactRepository() {
return new ContactRepository();
}

@Bean
public GroupRepository groupRepository() {
return new GroupRepository();
}

@Bean
public TagRepository tagRepository() {
return new TagRepository();
}

Вышесказанное функционально эквивалентно двум последним версиям конфигурации XML. Обратите внимание, что contactController сопоставлен с областью SESSION.


Приятной особенностью этой конфигурации является то, что вы можете делать все, что захотите, в Java для создания объекта, так как методы похожи на фабричные методы. Кроме того, поскольку это Java, вы можете создавать подклассы конфигурации, если у вас есть общая конфигурация. Таким образом, если у вас есть класс приложения, например, веб-приложение CRUD, вы можете создать общую базовую конфигурацию и затем создать подкласс для каждого приложения. (Обратите внимание, что вы могли бы сделать вышесказанное более лаконичным, используя автоматическую разводку и используя конструкторы вместо методов установки и т. Д.).


(Вы можете найти приведенный выше пример, используя модуль Spring Java Config, в разделе «Архитектурные доказательства концепции: пример контактов 5» .)

 

Использование Spring с JSF дает много преимуществ, так что ждите новых постов на эту тему. Этот пост просто царапает поверхность власти весны. Кроме того, Том Селуччи, Пол Хиксон и я пишем серию статей для IBM developerWorks по эффективному объединению JSF, JPA и Spring. Первая статья посвящена Spring DI и JSF и содержит пошаговые инструкции по объединению Spring и JSF.

Серия статей JSF / Spring будет включать:

  • Настройка Spring для работы с JSF,
  • DI для объектов, жизненный цикл которых контролируется JSF (например, PhaseListeners, Converters и т. Д.),
  • Решение общих проблем с JPA в веб-приложении JSF,
  • Использование прокси-серверов области Spring для простого написания эффективных, но согласованных управляемых компонентов JSF,
  • и больше

Примеры из этой серии Spring / JSF дополнят примеры из этой серии руководств по JSF 1.2 .

Что вы думаете о Spring Java Config?

Что вы думаете о поддержке IoC в Spring по сравнению с поддержкой IoC в JSF?

Об авторе

— технический директор Mammatus и эксперт по Java и облачным вычислениям . Рик вовлечен в адвокацию Java CDI и Java EE. Реализации CDI — Resin CandiСварка шваApache OpenWebBeans