web.xml versus Initializer met Spring

1. Overzicht

In dit artikel behandelen we drie verschillende benaderingen voor het configureren van een DispatcherServlet beschikbaar in recente versies van de Lente kader:

  1. We beginnen met een XML configuratie en een web.xml het dossier
  2. Vervolgens migreren we de Servlet-declaratie van het web.xml bestand naar Java-configuratie, maar we laten elke andere configuratie in XML
  3. Eindelijk, in de derde en laatste stap van de refactoring, hebben we een 100% Java-geconfigureerd project

2. Het DispatcherServlet

Een van de kernconcepten van Lente MVC is de DispatcherServlet. De Spring-documentatie definieert het als:

Een centrale dispatcher voor HTTP-verzoekbehandelaars / controllers, bijv. voor web-UI-controllers of op HTTP gebaseerde externe service-exporteurs. Verzendingen naar geregistreerde afhandelaars voor het verwerken van een webverzoek, met handige mogelijkheden voor het in kaart brengen en afhandelen van uitzonderingen.

In feite de DispatcherServlet is het toegangspunt van elk Lente MVC toepassing. Het doel is om te onderscheppen HTTP verzoeken en om ze naar de juiste component te sturen die weet hoe ermee om te gaan.

3. Configuratie met web.xml

Als je te maken hebt met legacy Voorjaar projecten is het heel gewoon om te vinden XML configuratie en tot Voorjaar 3.1 De enige manier om het DispatcherServlet was met de WEB-INF / web.xml het dossier. In dit geval zijn er twee stappen vereist.

Laten we een voorbeeldconfiguratie bekijken - de eerste stap is de Servlet-declaratie:

 dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/dispatcher-config.xml 1 

Met dit blok XML we verklaren een servlet dat:

  1. Is genaamd "coördinator
  2. Is een voorbeeld van org.springframework.web.servlet.DispatcherServlet
  3. Wordt geïnitialiseerd met een parameter met de naam contextConfigLocation die het pad naar de configuratie bevat XML

laden bij opstarten is een geheel getal dat de volgorde aangeeft waarin meerdere servlets moeten worden geladen. Dus als u meer dan één servlet moet declareren, kunt u bepalen in welke volgorde ze worden geïnitialiseerd. Servlets gemarkeerd met lagere gehele getallen worden geladen vóór servlets die zijn gemarkeerd met hogere gehele getallen.

Nu is onze servlet geconfigureerd. De tweede stap is het declareren van een servlet-mapping:

 verzender / 

Met de servlet-mapping verbinden we het met zijn naam tot een URLpatroon dat specificeert wat HTTP verzoeken worden erdoor behandeld.

4. Hybride configuratie

Met de goedkeuring van versie 3.0 van Servlet-API's, de web.xml -bestand is optioneel geworden en we kunnen nu Java gebruiken om het DispatcherServlet.

We kunnen een servlet registreren die een WebApplicationInitializer. Dit is het equivalent van de XML configuratie hierboven:

openbare klasse MyWebAppInitializer implementeert WebApplicationInitializer {@Override public void onStartup (ServletContext-container) {XmlWebApplicationContext context = nieuwe XmlWebApplicationContext (); context.setConfigLocation ("/ WEB-INF / spring / dispatcher-config.xml"); ServletRegistration.Dynamic dispatcher = container .addServlet ("dispatcher", nieuwe DispatcherServlet (context)); dispatcher.setLoadOnStartup (1); dispatcher.addMapping ("/"); }}

In dit voorbeeld zijn we:

  1. Implementatie van het WebApplicationInitializer koppel
  2. Het onStartup methode creëren we een nieuwe XmlWebApplicationContext geconfigureerd met hetzelfde bestand dat is doorgegeven als contextConfigLocation naar de servlet in de XML voorbeeld
  3. Vervolgens maken we een instantie van DispatcherServlet met de nieuwe context die we zojuist hebben geïnstantieerd
  4. En tot slot registreren we de servlet met een mapping URLpatroon

Dus we gebruikten Java om de servlet te declareren en te binden aan een URL-toewijzing maar we hielden de configuratie in een gescheiden XML het dossier: dispatcher-config.xml.

5. 100% Java Configuratie

Met deze aanpak wordt onze servlet gedeclareerd in Java, maar we hebben nog steeds een XML bestand om het te configureren. Met WebApplicationInitializer je kunt een 100% bereiken Java configuratie.

Laten we eens kijken hoe we het vorige voorbeeld kunnen refactoren.

Het eerste dat we moeten doen, is de toepassingscontext voor de servlet maken.

Deze keer gebruiken we een op annotaties gebaseerde context zodat we Java en annotaties voor configuratie en verwijder de noodzaak voor XML bestanden zoals dispatcher-config.xml:

AnnotationConfigWebApplicationContext context = nieuwe AnnotationConfigWebApplicationContext ();

Dit type context kan vervolgens worden geconfigureerd door een configuratieklasse te registreren:

context.register (AppConfig.class);

Of een heel pakket instellen dat wordt gescand op configuratieklassen:

context.setConfigLocation ("com.example.app.config");

Nu onze toepassingscontext is gemaakt, kunnen we een luisteraar toevoegen aan het ServletContext dat laadt de context:

container.addListener (nieuwe ContextLoaderListener (context));

De volgende stap is het maken en registreren van onze dispatcher-servlet:

ServletRegistration.Dynamic dispatcher = container .addServlet ("dispatcher", nieuwe DispatcherServlet (context)); dispatcher.setLoadOnStartup (1); dispatcher.addMapping ("/");

Nu onze WebApplicationInitializer zou er als volgt uit moeten zien:

openbare klasse MyWebAppInitializer implementeert WebApplicationInitializer {@Override public void onStartup (ServletContext-container) {AnnotationConfigWebApplicationContext context = nieuwe AnnotationConfigWebApplicationContext (); context.setConfigLocation ("com.example.app.config"); container.addListener (nieuwe ContextLoaderListener (context)); ServletRegistration.Dynamic dispatcher = container .addServlet ("dispatcher", nieuwe DispatcherServlet (context)); dispatcher.setLoadOnStartup (1); dispatcher.addMapping ("/"); }}

Java en annotatieconfiguratie biedt veel voordelen. Gewoonlijk leidt het tot een kortere en beknoptere configuratie en bieden annotaties meer context aan declaraties, omdat het zich op dezelfde locatie bevindt met de code die ze configureren.

Maar dit is niet altijd de beste of zelfs mogelijke manier. Sommige ontwikkelaars geven er bijvoorbeeld de voorkeur aan om hun code en configuratie gescheiden te houden, of het kan zijn dat u moet werken met code van derden die u niet kunt wijzigen.

6. Conclusie

In dit artikel hebben we verschillende manieren besproken om een DispatcherServlet in Lente 3.2+ en het is aan jou om te beslissen welke je wilt gebruiken op basis van je voorkeuren. Voorjaar zal zich aanpassen aan uw beslissing, wat u ook kiest.

Je kunt de broncode van dit artikel op Github hier en hier vinden.