2014-10-31 25 views
31

Sto lavorando con Spring 4.0.7Quando si utilizza AbstractAnnotationConfigDispatcherServletInitializer e WebApplicationInitializer?

Ho fatto una ricerca su configurare Spring MVC tramite JavaConfig.

Praticamente fino a ieri ho visto due configurazioni che utilizzano queste due opzioni

  1. estende AbstractAnnotationConfigDispatcherServletInitializer
  2. estende WebMvcConfigurerAdapter e implementa WebApplicationInitializer

Nota: (2) sono due classi , uno per l'estensione e l'altro per l'implementazione

sto usando (2), perché ho trovato molti esempi in cui sono in grado di configurare i convertitori, formattatori, risorse gestori ecc ...

Ma negli ultimi giorni ho cercato di aiutare una domanda su StackOverflow e io ho realizzato (1) esiste .. Ho fatto qualche panoramica su Google riguardo (1) ed esiste qualche esempio di lavoro con (1)

La mia domanda è come descrive il titolo di questo post.

Thank You

+0

Dividere la configurazione di distribuzione dalla configurazione del contesto. –

risposta

45

Con il rilascio della Servlet 3.0 spec è stato possibile configurare il Servlet Container con (quasi) senza xml. Per questo c'è lo ServletContainerInitializer nelle specifiche Servlet. In questa classe puoi registrare filtri, listener, servlet, ecc. Come faresti tradizionalmente in uno web.xml.

Spring fornisce un'implementazione SpringServletContainerInitializer che sa come gestire le classi WebApplicationInitializer. Spring fornisce anche un paio di classi base da estendere per semplificarti la vita, lo AbstractAnnotationConfigDispatcherServletInitializer è uno di quelli. Registra a ContextLoaderlistener a scelta (opzionale) e uno DispatcherServlet e consente di aggiungere facilmente classi di configurazione da caricare per entrambe le classi e di applicare filtri a DispatcherServlet e fornire il mapping servlet.

Il WebMvcConfigurerAdapter è per la configurazione di Spring MVC, la sostituzione del file xml caricato da DispatcherServlet per la configurazione di Spring MVC. Il WebMvcConfigurerAdapter deve essere utilizzato per una classe @Configuration.

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

Non suggerirei di miscelare quelli in quanto sono fondamentalmente 2 preoccupazioni diverse. Il primo è per la configurazione del contenitore servlet, quest'ultimo per la configurazione di Spring MVC.

Si vorrebbe dividerli in 2 classi.

Per la configurazione.

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

Per il bootstrap dell'applicazione.

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[] {"/"}; 
    } 

} 

Un ulteriore vantaggio è che è ora possibile utilizzare le classi di convenienza previste entro la primavera, invece di configurare manualmente il DispatcherServlet e/o ContextLoaderListener.

+0

Sì, non è saggio mix (1) e (2), attualmente sto lavorando con (2), quindi ('estende WebMvcConfigurerAdapter e implementa WebApplicationInitializer') –

+0

In realtà sta mescolando le 2 strategie. Ora hai una singola classe che è responsabile della configurazione del contenitore servlet e della configurazione dell'applicazione Spring. Avrei 2 classi una per la configurazione dell'applicazione e una per il contenitore servlet. –

+0

Sono confuso, ho visto alcuni esempi sull'utilizzo di WebMvcConfigurerAdapter e WebApplicationInitializer, utilizzo solo questi due * oggetti *, uno per sostituire il web.xml e l'altro per configurare Spring MVC. –

5

Per iniziare dall'inizio vale la pena di esaminare come viene avviato il contenitore servlet.

  • SpringServletContainerInitializer viene avviato automaticamente da qualsiasi contenitore Servlet 3.0.
  • SpringServletContainerInitializer cerca le classi che implementano WebApplicationInitializer (collegamento a spring.io, anche descritto in "Spring In Action" 4a edizione di Craig Walls, p.135).

Quindi, per iniziare - SpringServletContainerInitializer deve trovare la classe giusta attuazione WebApplicationInitializer. Esistono due modi per realizzarlo:

  1. Uno è implementando WebApplicationInitializer da solo; l'interfaccia è stata introdotta nella primavera 3.1
  2. Il secondo è estendendo la classe AbstractAnnotationConfigDispatcherServletInitializer che implementa anche WebApplicationInitializer. La classe è stata introdotta in Spring 3.2 per comodità ed è "l'approccio preferito per le applicazioni che utilizzano la configurazione Spring basata su Java". - guarda il link. Consente di avviare il contesto dell'applicazione servlet e il contesto dell'applicazione root.

Vorrei anche per higlight che WebMvcConfigurerAdapter si parla non deve essere confuso con WebApplicationInitializer. Come suggerisce il nome, ha a che fare con la configurazione di "Mvc". È una classe adattatore che implementa metodi vuoti da WebMvcConfigurer. Si utilizza quando si configura il controller Mvc con l'annotazione @EnableWebMvc.

Spero che questo aiuti.

Problemi correlati