Весенние статьи становятся трендом в этом блоге, я, вероятно, должен подать заявку на должность 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
AnnotationConfigWebApplicationContextJavaDoc@ContextConfigurationJavaDoc (для настройки Spring Test для использования JavaConfig)
