it-swarm.com.ru

Когда использовать AbstractAnnotationConfigDispatcherServletInitializer и WebApplicationInitializer?

Я работаю с Spring 4.0.7

Я провел исследование о настройке Spring MVC через JavaConfig.

Практически до вчерашнего дня я видел две конфигурации, использующие эти две опции

  1. расширяет AbstractAnnotationConfigDispatcherServletInitializer
  2. расширяет WebMvcConfigurerAdapter и реализует WebApplicationInitializer

Примечание: (2) два класса, один для расширения и другой для реализации

Я использую (2), потому что я нашел много примеров, где я могу настроить конвертеры, форматеры, обработчики ресурсов и т.д.

Но в последние дни я попытался помочь с вопросом о StackOverflow, и я понял, что (1) существует. Я сделал некоторый обзор в Google о (1) и существует несколько примеров работы с (1)

Мой вопрос, как описать заголовок этого поста.

Спасибо

41
Manuel Jordan

С выпуском спецификации Servlet 3.0 стало возможным настраивать ваш контейнер сервлетов практически без XML. Для этого в спецификации сервлета есть ServletContainerInitializer . В этом классе вы можете зарегистрировать фильтры, слушатели, сервлеты и т.д., Как вы это обычно делаете в web.xml.

Spring предоставляет реализацию SpringServletContainerInitializer , которая знает, как обрабатывать WebApplicationInitializer классы. Spring также предоставляет несколько базовых классов для расширения, чтобы сделать вашу жизнь проще. AbstractAnnotationConfigDispatcherServletInitializer - один из них. Он регистрирует ContextLoaderlistener (опционально) и DispatcherServlet и ​​позволяет легко добавлять классы конфигурации для загрузки для обоих классов и применять фильтры к DispatcherServlet и ​​предоставлять сервлет отображение.

WebMvcConfigurerAdapter предназначен для настройки Spring MVC, замены xml-файла, загруженного DispatcherServlet для настройки Spring MVC. WebMvcConfigurerAdapter следует использовать для @Configuration учебный класс.

@Configuration
@EnableWebMvc
public class WebConfiguration 
    extends WebMvcConfigurerAdapter implements WebApplicationInitializer
{ ... }

Я бы не советовал смешивать их, так как это в основном две разные проблемы. Первый предназначен для настройки контейнера сервлета, второй - для настройки Spring MVC.

Вы хотели бы разделить их на 2 класса.

Для конфигурации.

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter { ... }

Для начальной загрузки приложения.

public class MyWebApplicationInitializer
    extends AbstractAnnotationConfigDispatcherServletInitializer
{

    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {RootConfig.class};
    }

    protected Class<?>[] getServletConfigClasses()  {
        return new Class[] {WebConfiguration .class};
    }

    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

}

Дополнительным преимуществом является то, что теперь вы можете использовать удобные классы, предоставляемые Spring, вместо ручной настройки DispatcherServlet и ​​/ или ContextLoaderListener.

55
M. Deinum

Для начала стоит посмотреть, как запускается контейнер сервлетов.

  • SpringServletContainerInitializer автоматически загружается любым контейнером Servlet 3.0.
  • SpringServletContainerInitializer ищет классы, реализующие WebApplicationInitializer (ссылка на spring.io ; также хорошо описана в " Spring In Action " 4-й редакции Крейга Уоллса, стр.135).

Итак, для начала - SpringServletContainerInitializer должен найти правильный класс, реализующий WebApplicationInitializer . Есть два способа сделать это:

  1. Одним из них является реализация WebApplicationInitializer самостоятельно; интерфейс был представлен в Spring 3.1
  2. Второй - это расширение класса AbstractAnnotationConfigDispatcherServletInitializer , который также реализует WebApplicationInitializer. Класс был введен в Spring 3.2 для удобства и является "предпочтительным подходом для приложений, использующих конфигурацию Spring на основе Java". - смотрите ссылку. Это позволяет вам запускать контекст приложения сервлета, а также контекст корневого приложения.

Я также хотел бы подчеркнуть, что WebMvcConfigurerAdapter вы упоминаете, не следует путать с WebApplicationInitializer. Как следует из названия, это связано с настройкой "Mvc". Это класс адаптера, который реализует пустые методы из WebMvcConfigurer . Вы используете его, когда настраиваете свой контроллер Mvc с помощью @ EnableWebMvc аннотации.

Надеюсь это поможет.

12
Witold Kaczurba