Весенние статьи становятся трендом в этом блоге, я, вероятно, должен подать заявку на должность SpringSource
Мои коллеги иногда ругают меня за упрямство в использовании конфигурации XML для Spring. Да, это похоже на 2000-е, но у XML есть определенные преимущества:
- Конфигурация централизована, она не разбросана по всем различным компонентам, поэтому вы можете получить хороший обзор компонентов и их соединений в одном месте.
- Если вам нужно разбить ваши файлы, нет проблем, Spring позволит вам это сделать. Затем он собирает их во время выполнения с помощью внутренних
<import>
тегов или агрегирования внешних контекстных файлов. - Только конфигурация XML допускает явное подключение — в отличие от автоматического подключения. Иногда последнее слишком волшебно на мой вкус. Его очевидная простота скрывает реальную сложность: нам нужно не только переключаться между автоматическим подключением по типу и имени, но, что более важно, стратегия выбора соответствующего компонента из всех подходящих исключается, но более опытным разработчикам Spring. Профили, кажется, делают это проще, но относительно новы и известны немногим
- И последнее, но не менее важное: XML полностью ортогонален файлу Java: между ними нет связи, так что класс можно использовать в более чем одном контексте с различными конфигурациями
Единственная проблема с XML заключается в том, что вам нужно подождать до времени выполнения, чтобы обнаружить опечатки в бине или в какой-то другой глупой бу-бу. С другой стороны, использование плагина Spring IDE (или интегрированного Spring Tools Suite) определенно поможет вам в этом.
Интересной альтернативой как XML, так и прямым аннотациям в классах компонентов является JavaConfig, бывший отдельный проект, встроенный в саму Spring начиная с версии 3.0. Он объединяет преимущество разделения XML с проверками времени компиляции Java. JavaConfig можно рассматривать как эквивалент файла XML, написанный только на Java. Вся документация, конечно, доступна онлайн, но эта статья позволит вам начать работу с JavaConfig. В качестве примера, давайте перенесемся из следующего XML-файла в JavaConfig
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id="button" class="javax.swing.JButton"> <constructor-arg value="Hello World" /> </bean> <bean id="anotherButton" class="javax.swing.JButton"> <property name="icon" ref="icon" /> </bean> <bean id="icon" class="javax.swing.ImageIcon"> <constructor-arg> <bean class="java.net.URL"> <constructor-arg value="http://morevaadin.com/assets/images/learning_vaadin_cover.png" /> </bean> </constructor-arg> </bean> </beans>
Эквивалентный файл следующий:
import java.net.MalformedURLException; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MigratedConfiguration { @Bean public JButton button() { return new JButton("Hello World"); } @Bean public JButton anotherButton() { return new JButton(icon()); } @Bean public Icon icon() throws MalformedURLException { URL url = new URL("http://morevaadin.com/assets/images/learning_vaadin_cover.png"); return new ImageIcon(url); } }
Использование проще, чем просто: аннотируйте основной класс с помощью @Configuration
и отдельные методы производителя с помощью @Bean
.
это просто работает.
Единственный недостаток, ИМХО, заключается в том, что в нем используется автопроводка. Кроме того,
Обратите внимание, что в веб-среде дескриптор веб-развертывания должен быть обновлен следующими строками:
<context-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.packtpub.learnvaadin.springintegration.SpringIntegrationConfiguration</param-value> </context-param>
Источники для этой статьи доступны в формате Maven / Eclipse здесь .
Чтобы идти дальше :
- Документация по конфигурации контейнера на основе Java
AnnotationConfigWebApplicationContext
JavaDoc@ContextConfiguration
JavaDoc (для настройки Spring Test для использования JavaConfig)