2014-10-31 6 views
31

Я работаю с Spring 4.0.7При использовании AbstractAnnotationConfigDispatcherServletInitializer и WebApplicationInitializer?

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

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

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

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

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

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

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

Спасибо

+0

Разделите конфигурацию развертывания из конфигурации контекста. –

ответ

45

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

Весна обеспечивает реализацию 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.

+0

Да, не мудрый микс (1) и (2), в настоящее время я работаю с (2), поэтому ('extends WebMvcConfigurerAdapter и реализует WebApplicationInitializer') –

+0

Это фактически смешивает 2 стратегии. Теперь у вас есть один класс, который отвечает за настройку контейнера сервлета и за настройку приложения Spring. У меня было бы 2 класса для настройки приложения и одного для контейнера сервлета. –

+0

Я в замешательстве, я видел несколько примеров использования WebMvcConfigurerAdapter и WebApplicationInitializer, я использую только эти два * объекта *, один для замены web.xml и другого, чтобы настроить Spring MVC. –

5

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

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

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

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

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

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

Смежные вопросы