Статьи

Попробуйте заменить XML-конфигурацию Spring на JavaConfig

Весенние статьи становятся трендом в этом блоге, я, вероятно, должен подать заявку на должность SpringSource :-)

Мои коллеги иногда ругают меня за упрямство в использовании конфигурации XML для Spring. Да, это похоже на 2000-е, но у XML есть определенные преимущества:

  1. Конфигурация централизована, она не разбросана по всем различным компонентам, поэтому вы можете получить хороший обзор компонентов и их соединений в одном месте.
  2. Если вам нужно разбить ваши файлы, нет проблем, Spring позволит вам это сделать. Затем он собирает их во время выполнения с помощью внутренних <import>тегов или агрегирования внешних контекстных файлов.
  3. Только конфигурация XML допускает явное подключение — в отличие от автоматического подключения. Иногда последнее слишком волшебно на мой вкус. Его очевидная простота скрывает реальную сложность: нам нужно не только переключаться между автоматическим подключением по типу и имени, но, что более важно, стратегия выбора соответствующего компонента из всех подходящих исключается, но более опытным разработчикам Spring. Профили, кажется, делают это проще, но относительно новы и известны немногим
  4. И последнее, но не менее важное: 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
  • AnnotationConfigWebApplicationContextJavaDoc
  • @ContextConfigurationJavaDoc (для настройки Spring Test для использования JavaConfig)