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

Я работаю с Spring 4.0.7

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

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

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

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

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

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

мой вопрос в том, как описывается название этого поста.

Спасибо

2 ответов


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

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

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

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

я бы не рекомендовал смешивать их, поскольку они в основном 2 разные проблемы. Первый предназначен для настройки контейнера сервлетов, последний-для настройки 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[] {"/"};
    }

}

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


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

  • SpringServletContainerInitializer автоматически загружается любым контейнером сервлета 3.0.
  • SpringServletContainerInitializer ищет классы, реализующие WebApplicationInitializer (ссылка на весна.Ио; также хорошо describeed в"Весна В Действиях" 4-е издание, Крейг стен, С. 135).

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

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

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

надеюсь, что это помогает.