Een vergelijking tussen lente- en springlaars

1. Overzicht

In dit artikel gaan we kijken naar de verschillen tussen de standaard Spring-frameworks en Spring Boot.

We zullen ons concentreren op en bespreken hoe de modules van Spring, zoals MVC en Security, verschillen wanneer ze worden gebruikt in de kern van Spring en wanneer ze worden gebruikt met Boot.

2. Wat is lente?

Simpel gezegd, het Spring-framework biedt uitgebreide infrastructuurondersteuning voor het ontwikkelen van Java-applicaties.

Het zit boordevol leuke functies zoals Dependency Injection en kant-en-klare modules zoals:

  • Lente JDBC
  • Lente MVC
  • Lente beveiliging
  • Lente AOP
  • Lente ORM
  • Lente Test

Deze modules kunnen de ontwikkeltijd van een applicatie drastisch verkorten.

In de begintijd van Java-webontwikkeling moesten we bijvoorbeeld veel standaardcode schrijven om een ​​record in een gegevensbron in te voegen. Maar door de JDBC-sjabloon van de Spring JDBC-module kunnen we het terugbrengen tot een paar regels code met slechts een paar configuraties.

3. Wat is Spring Boot?

Spring Boot is in feite een uitbreiding van het Spring-raamwerk waardoor de standaardconfiguraties die nodig zijn voor het opzetten van een Spring-applicatie, zijn geëlimineerd.

Het neemt een eigenzinnige kijk op het Spring-platform dat de weg effende voor een sneller en efficiënter ontwikkelingsecosysteem.

Hier zijn slechts enkele van de functies in Spring Boot:

  • Eigenzinnige 'starter'-afhankelijkheden om het bouwen en configureren van applicaties te vereenvoudigen
  • Ingebouwde server om complexiteit bij de implementatie van applicaties te voorkomen
  • Metrische gegevens, statuscontrole en externe configuratie
  • Automatische configuratie voor Spring-functionaliteit - waar mogelijk

Laten we stap voor stap vertrouwd raken met beide kaders.

4. Maven afhankelijkheden

Laten we eerst eens kijken naar de minimale afhankelijkheden die nodig zijn om een ​​webapplicatie te maken met Spring:

 org.springframework spring-web 5.2.9.RELEASE org.springframework spring-webmvc 5.2.9.RELEASE 

In tegenstelling tot Spring vereist Spring Boot slechts één afhankelijkheid om een ​​webtoepassing in gebruik te nemen:

 org.springframework.boot spring-boot-starter-web 2.3.4.RELEASE 

Alle andere afhankelijkheden worden tijdens de build automatisch aan het uiteindelijke archief toegevoegd.

Een ander goed voorbeeld is het testen van bibliotheken. We gebruiken meestal de set Spring Test-, JUnit-, Hamcrest- en Mockito-bibliotheken. In een Spring-project zouden we al deze bibliotheken als afhankelijkheden moeten toevoegen.

Maar in Spring Boot hebben we alleen de starter-afhankelijkheid nodig voor testen om deze bibliotheken automatisch op te nemen.

Spring Boot biedt een aantal starter-afhankelijkheden voor verschillende Spring-modules. Enkele van de meest gebruikte zijn:

  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-boot-starter-test
  • spring-boot-starter-web
  • spring-boot-starter-thymeleaf

Bekijk ook de Spring-documentatie voor de volledige lijst met starters.

5. MVC-configuratie

Laten we eens kijken naar de configuratie die nodig is om een ​​JSP-webtoepassing te maken met zowel Spring als Spring Boot.

Spring vereist het definiëren van de dispatcher-servlet, toewijzingen en andere ondersteunende configuraties. We kunnen dit doen met behulp van de web.xml bestand of een Initializer klasse:

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

We moeten ook het @EnableWebMvc annotatie bij een @Configuratie class en definieer een view-resolver om de views op te lossen die door de controllers worden geretourneerd:

@EnableWebMvc @Configuration openbare klasse ClientWebConfig implementeert WebMvcConfigurer {@Bean openbare ViewResolver viewResolver () {InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver (); bean.setViewClass (JstlView.class); bean.setPrefix ("/ WEB-INF / view /"); bean.setSuffix (". jsp"); terugkeer boon; }}

In vergelijking met dit alles, Spring Boot heeft maar een paar eigenschappen nodig om dingen te laten werken, zodra we de webstarter hebben toegevoegd:

spring.mvc.view.prefix = / WEB-INF / jsp / spring.mvc.view.suffix = .jsp

Alle bovenstaande Spring-configuratie wordt automatisch opgenomen door de Boot-webstarter toe te voegen via een proces dat autoconfiguratie wordt genoemd.

Dit betekent dat Spring Boot zal kijken naar de afhankelijkheden, eigenschappen en bonen die in de applicatie bestaan ​​en configuratie op basis hiervan mogelijk maken.

Als we onze eigen aangepaste configuratie willen toevoegen, verdwijnt de automatische configuratie van Spring Boot natuurlijk.

5.1. Template Engine configureren

Laten we nu leren hoe u een Thymeleaf template-engine in zowel Spring als Spring Boot.

In het voorjaar moeten we de thymeleaf-spring5 afhankelijkheid en enkele configuraties voor de view resolver:

@Configuration @EnableWebMvc openbare klasse MvcWebConfig implementeert WebMvcConfigurer {@Autowired privé ApplicationContext applicationContext; @Bean openbare SpringResourceTemplateResolver templateResolver () {SpringResourceTemplateResolver templateResolver = nieuwe SpringResourceTemplateResolver (); templateResolver.setApplicationContext (applicationContext); templateResolver.setPrefix ("/ WEB-INF / views /"); templateResolver.setSuffix (". html"); retourneer templateResolver; } @Bean openbare SpringTemplateEngine templateEngine () {SpringTemplateEngine templateEngine = nieuwe SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver ()); templateEngine.setEnableSpringELCompiler (true); retourneer templateEngine; } @Override public void configureViewResolvers (ViewResolverRegistry-register) {ThymeleafViewResolver resolver = nieuwe ThymeleafViewResolver (); resolver.setTemplateEngine (templateEngine ()); registry.viewResolver (resolver); }}

Spring Boot 1 vereiste alleen de afhankelijkheid van spring-boot-starter-thymeleaf in staat te stellen Thymeleaf ondersteuning in een webapplicatie. Maar vanwege de nieuwe functies in Thymeleaf3.0, we moeten toevoegen thymeleaf-layout-dialect ook als afhankelijkheid in een Spring Boot 2-webapplicatie. Als alternatief kunnen we ervoor kiezen om een spring-boot-starter-thymeleaf afhankelijkheid die dit allemaal voor ons zal regelen.

Zodra de afhankelijkheden aanwezig zijn, kunnen we de sjablonen toevoegen aan het src / main / resources / templates map en de Spring Boot zal ze automatisch weergeven.

6. Lente-beveiligingsconfiguratie

Eenvoudigheidshalve zullen we zien hoe de standaard HTTP Basic-authenticatie wordt ingeschakeld met behulp van deze frameworks.

Laten we beginnen met te kijken naar de afhankelijkheden en configuratie die we nodig hebben om beveiliging in te schakelen met Spring.

De lente vereist zowel de norm spring-security-web en spring-security-config afhankelijkheden om beveiliging in een applicatie in te stellen.

De volgende, we moeten een klasse toevoegen die de extensie WebSecurityConfigurerAdapter en maakt gebruik van de @EnableWebSecurity annotatie:

@Configuration @EnableWebSecurity openbare klasse CustomWebSecurityConfigurerAdapter breidt WebSecurityConfigurerAdapter {@Autowired openbare void configureGlobal (AuthenticationManagerBuilder auth) uit Exception {auth.inMemoryAuthentication () .withUser ("user1E password") (. ("ROLE_USER"); } @Override beschermde ongeldige configuratie (HttpSecurity http) genereert uitzondering {http.authorizeRequests () .anyRequest (). Geauthenticeerd () .and () .httpBasic (); } @Bean public PasswordEncoder passwordEncoder () {retourneer nieuwe BCryptPasswordEncoder (); }}

Hier gebruiken we inMemoryAuthentication om de authenticatie in te stellen.

Evenzo vereist Spring Boot ook deze afhankelijkheden om het te laten werken. Maar we hoeven alleen de afhankelijkheid van te definiërenspring-boot-starter-security aangezien dit automatisch alle relevante afhankelijkheden aan het klassenpad zal toevoegen.

De beveiligingsconfiguratie in Spring Boot is dezelfde als hierboven.

Als je wilt weten hoe de JPA-configuratie kan worden bereikt in zowel Spring als Spring Boot, bekijk dan ons artikel A Guide to JPA with Spring.

7. Applicatie-bootstrap

Het fundamentele verschil in bootstrapping van een applicatie in Spring en Spring Boot ligt bij de servlet. Spring gebruikt ofwel de web.xml of SpringServletContainerInitializer als het opstartpunt van de bootstrap.

Aan de andere kant gebruikt Spring Boot alleen Servlet 3-functies om een ​​applicatie op te starten. Laten we hier in detail over praten.

7.1. Hoe Spring Bootstraps?

De lente ondersteunt zowel de erfenis web.xml manier van bootstrapping en de nieuwste Servlet 3+ methode.

Laten we eens kijken naar de web.xml aanpak in stappen:

  1. Servlet-container (de server) leest web.xml
  2. De DispatcherServlet gedefinieerd in de web.xml wordt geïnstantieerd door de container
  3. DispatcherServlet creëert WebApplicationContext door te lezen WEB-INF / {servletName} -servlet.xml
  4. eindelijk, de DispatcherServlet registreert de bonen die zijn gedefinieerd in de toepassingscontext

Hier is hoe Spring bootstraps met behulp van Servlet 3+ benadering:

  1. De container zoekt naar klassen die worden geïmplementeerd ServletContainerInitializer en voert uit
  2. De SpringServletContainerInitializer vindt alle klassen die worden geïmplementeerd WebApplicationInitializer
  3. De WebApplicationInitializer creëert de context met XML of @Configuratie klassen
  4. De WebApplicationInitializer creëert het DispatcherServlet met de eerder gemaakte context.

7.2. Hoe Spring Boot Bootstraps?

Het startpunt van een Spring Boot-applicatie is de klasse waarmee is geannoteerd @SpringBootApplication:

@SpringBootApplication openbare klasse Toepassing {openbare statische leegte hoofd (String [] args) {SpringApplication.run (Application.class, args); }}

Spring Boot gebruikt standaard een ingesloten container om de applicatie uit te voeren. In dit geval gebruikt Spring Boot de openbare statische leegte main toegangspunt om een ​​embedded webserver te starten.

Het zorgt ook voor de binding van de Servlet, Filter, en ServletContextInitializer bonen uit de toepassingscontext naar de ingesloten servletcontainer.

Een ander kenmerk van Spring Boot is dat het automatisch alle klassen in hetzelfde pakket of subpakketten van de Main-klasse scant op componenten.

Spring Boot biedt de mogelijkheid om het ook als webarchief in een externe container te implementeren. In dit geval moeten we de extensie SpringBootServletInitializer:

@SpringBootApplication openbare klasse Applicatie breidt SpringBootServletInitializer uit {// ...}

Hier zoekt de externe servlet-container naar de Main-class die is gedefinieerd in het META-INF-bestand van het webarchief en het SpringBootServletInitializer zorgt voor het binden van de Servlet, Filter, en ServletContextInitializer.

8. Verpakking en implementatie

Laten we tot slot kijken hoe een applicatie kan worden verpakt en geïmplementeerd. Beide frameworks ondersteunen de algemene technologieën voor pakketbeheer, zoals Maven en Gradle. Maar als het op implementatie aankomt, verschillen deze frameworks enorm.

De Spring Boot Maven-plug-in biedt bijvoorbeeld Spring Boot-ondersteuning in Maven. Het maakt het ook mogelijk om uitvoerbare jar- of oorlogsarchieven te verpakken en een applicatie "in-place" uit te voeren.

Enkele van de voordelen van Spring Boot ten opzichte van Spring in de context van implementatie zijn:

  • Biedt ondersteuning voor ingebedde containers
  • Voorziening om de potten onafhankelijk uit te voeren met behulp van de opdracht java -jar
  • Optie om afhankelijkheden uit te sluiten om mogelijke jar-conflicten te voorkomen bij implementatie in een externe container
  • Optie om actieve profielen op te geven bij implementatie
  • Willekeurige poortgeneratie voor integratietests

9. Conclusie

In deze tutorial hebben we geleerd over de verschillen tussen Spring en Spring Boot.

In een paar woorden kunnen we zeggen dat Spring Boot gewoon een uitbreiding is van Spring zelf om het ontwikkelen, testen en implementeren gemakkelijker te maken.


$config[zx-auto] not found$config[zx-overlay] not found