Подтвердить что ты не робот

При использовании AbstractAnnotationConfigDispatcherServletInitializer и WebApplicationInitializer?

Я работаю с Spring 4.0.7

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

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

  • extends AbstractAnnotationConfigDispatcherServletInitializer
  • extends WebMvcConfigurerAdapter и реализует WebApplicationInitializer

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

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

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

Мой вопрос заключается в том, как описывается заголовок этого сообщения.

Спасибо

4b9b3361

Ответ 1

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

Spring предоставляет реализацию SpringServletContainerInitializer, которая умеет обрабатывать WebApplicationInitializer классы. Spring также предоставляет пару базовых классов, чтобы упростить вашу жизнь AbstractAnnotationConfigDispatcherServletInitializer. Он регистрирует a 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.

Ответ 2

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

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

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

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

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

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