En sammenligning mellem fjeder og fjederstøvle

1. Oversigt

I denne opskrivning skal vi se på forskellene mellem standard Spring Frameworks og Spring Boot.

Vi fokuserer på og diskuterer, hvordan modulerne fra Spring, som MVC og sikkerhed, adskiller sig, når de bruges i kernefjederen i forhold til, når de bruges sammen med Boot.

2. Hvad er forår?

Kort sagt giver Spring Framework omfattende infrastruktursupport til udvikling af Java-applikationer.

Den er fyldt med nogle gode funktioner som Dependency Injection og out of the box-moduler som:

  • Forår JDBC
  • Forår MVC
  • Forårssikkerhed
  • Forår AOP
  • Forår ORM
  • Forårstest

Disse moduler kan reducere udviklingen af ​​en applikation drastisk.

For eksempel var vi i de tidlige dage af Java-webudvikling nødt til at skrive en masse kedelpladekode for at indsætte en post i en datakilde. Men ved at bruge JDBCTemplate i Spring JDBC-modulet kan vi reducere det til et par kodelinjer med kun få konfigurationer.

3. Hvad er Spring Boot?

Spring Boot er dybest set en udvidelse af Spring-rammen, som eliminerede de kedelpladekonfigurationer, der kræves til opsætning af en Spring-applikation.

Det tager et meningsfuldt billede af Spring-platformen, der banede vejen for et hurtigere og mere effektivt udviklingsøkosystem.

Her er blot nogle få af funktionerne i Spring Boot:

  • Opinionated 'starter' afhængigheder for at forenkle build og applikationskonfiguration
  • Integreret server for at undgå kompleksitet i implementering af applikationer
  • Metrics, Health check og eksternaliseret konfiguration
  • Automatisk konfiguration til Spring-funktionalitet - når det er muligt

Lad os blive fortrolige med begge disse rammer trin for trin.

4. Maven-afhængigheder

Lad os først se på de mindste afhængigheder, der kræves for at oprette en webapplikation ved hjælp af Spring:

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

I modsætning til Spring kræver Spring Boot kun en afhængighed for at få en webapplikation til at køre:

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

Alle andre afhængigheder føjes automatisk til det endelige arkiv i løbet af byggetiden.

Et andet godt eksempel er at teste biblioteker. Vi bruger normalt sættet med Spring Test-, JUnit-, Hamcrest- og Mockito-biblioteker. I et forårsprojekt skal vi tilføje alle disse biblioteker som afhængigheder.

Men i Spring Boot har vi kun brug for startafhængighed til test for automatisk at inkludere disse biblioteker.

Spring Boot giver et antal startafhængigheder for forskellige Spring-moduler. Nogle af de mest anvendte er:

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

For den fulde liste over startere, se også forårsdokumentationen.

5. MVC-konfiguration

Lad os undersøge den konfiguration, der kræves for at oprette en JSP-webapplikation ved hjælp af både Spring og Spring Boot.

Fjeder kræver definition af afsenderservlet, tilknytninger og andre understøttende konfigurationer. Vi kan gøre dette ved hjælp af enten web.xml fil eller en Initialiser klasse:

offentlig klasse MyWebAppInitializer implementerer WebApplicationInitializer {@ Override public void onStartup (ServletContext container) {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext (); context.setConfigLocation ("com.baeldung"); container.addListener (ny ContextLoaderListener (kontekst)); ServletRegistration.Dynamic dispatcher = container .addServlet ("dispatcher", ny DispatcherServlet (kontekst)); dispatcher.setLoadOnStartup (1); dispatcher.addMapping ("/"); }}

Vi skal også tilføje @EnableWebMvc kommentar til a @Konfiguration klasse og definer en view-resolver for at løse de synspunkter, der returneres fra controllerne:

@EnableWebMvc @ Configuration public class ClientWebConfig implementerer WebMvcConfigurer {@Bean public ViewResolver viewResolver () {InternalResourceViewResolver bean = new InternalResourceViewResolver (); bean.setViewClass (JstlView.class); bean.setPrefix ("/ WEB-INF / view /"); bean.setSuffix (". jsp"); retur bønne; }}

Sammenlignet med alt dette, Spring Boot har kun brug for et par egenskaber for at få tingene til at fungere, når vi først har tilføjet webstarteren:

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

Alle fjederkonfigurationer ovenfor inkluderes automatisk ved at tilføje Boot webstarter gennem en proces kaldet automatisk konfiguration.

Hvad dette betyder er, at Spring Boot vil se på de afhængigheder, egenskaber og bønner, der findes i applikationen og muliggør konfiguration baseret på disse.

Selvfølgelig, hvis vi vil tilføje vores egen brugerdefinerede konfiguration, så springer den automatiske konfiguration af Spring Boot tilbage.

5.1. Konfiguration af skabelonmotor

Lad os nu lære at konfigurere en Thymeleaf skabelonmotor i både Spring og Spring Boot.

I foråret skal vi tilføje thymeleaf-spring5 afhængighed og nogle konfigurationer til visningsopløseren:

@Configuration @EnableWebMvc public class MvcWebConfig implementerer WebMvcConfigurer {@Autowired private ApplicationContext applicationContext; @Bean public SpringResourceTemplateResolver templateResolver () {SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver (); templateResolver.setApplicationContext (applicationContext); templateResolver.setPrefix ("/ WEB-INF / visninger /"); templateResolver.setSuffix (". html"); retur skabelonResolver; } @Bean public SpringTemplateEngine templateEngine () {SpringTemplateEngine templateEngine = new SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver ()); templateEngine.setEnableSpringELCompiler (sand); returskabelonMotor; } @ Override offentlig ugyldighed configureViewResolvers (ViewResolverRegistry registry) {ThymeleafViewResolver resolver = ny ThymeleafViewResolver (); resolver.setTemplateEngine (templateEngine ()); registry.viewResolver (resolver); }}

Spring Boot 1 krævede kun afhængigheden af spring-boot-starter-thymeleaf at muliggøre Thymeleaf support i en webapplikation. Men på grund af de nye funktioner i Thymeleaf3.0, vi er nødt til at tilføje thymeleaf-layout-dialekt også som en afhængighed i en Spring Boot 2-webapplikation. Alternativt kan vi vælge at tilføje en spring-boot-starter-thymeleaf afhængighed, der tager sig af alt dette for os.

Når afhængighederne er på plads, kan vi tilføje skabelonerne til src / main / ressourcer / skabeloner mappen og Spring Boot vil vise dem automatisk.

6. Forårssikkerhedskonfiguration

Af enkelheds skyld vil vi se, hvordan standard HTTP Basic-godkendelse er aktiveret ved hjælp af disse rammer.

Lad os starte med at se på de afhængigheder og konfiguration, vi har brug for for at aktivere sikkerhed ved hjælp af Spring.

Foråret kræver både standarden fjeder-sikkerhed-web og spring-security-config afhængigheder for at konfigurere sikkerhed i et program.

Næste, vi er nødt til at tilføje en klasse, der udvider WebSecurityConfigurerAdapter og gør brug af @EnableWebSecurity kommentar:

@Configuration @EnableWebSecurity offentlig klasse CustomWebSecurityConfigurerAdapter udvider WebSecurityConfigurerAdapter {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) kaster undtagelse {auth.inMemoryAuthentication () .withUser ("user1"). Adgangskode. ". ("ROLE_USER"); } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http.authorizeRequests () .anyRequest (). Godkendt (). Og () .httpBasic (); } @Bean public PasswordEncoder passwordEncoder () {returner ny BCryptPasswordEncoder (); }}

Her bruger vi inMemoryAuthentication for at indstille godkendelsen.

På samme måde kræver Spring Boot også disse afhængigheder for at få det til at fungere. Men vi skal kun definere afhængigheden afspring-boot-starter-sikkerhed da dette automatisk tilføjer alle relevante afhængigheder til klassestien.

Sikkerhedskonfigurationen i Spring Boot er den samme som den ovenfor.

Hvis du har brug for at vide, hvordan JPA-konfigurationen kan opnås i både Spring og Spring Boot, så tjek vores artikel En guide til JPA med Spring.

7. Application Bootstrap

Den grundlæggende forskel i bootstrapping af en applikation i Spring og Spring Boot ligger hos servlet. Foråret bruger enten web.xml eller SpringServletContainerInitializer som startpunkt for bootstrap.

På den anden side bruger Spring Boot kun Servlet 3-funktioner til at starte en applikation. Lad os tale om dette i detaljer.

7.1. Hvordan Spring Bootstraps?

Foråret understøtter både arven web.xml måde til bootstrapping såvel som den nyeste Servlet 3+ metode.

Lad os se web.xml tilgang i trin:

  1. Servletbeholder (serveren) læser web.xml
  2. Det DispatcherServlet defineret i web.xml er instantieret af beholderen
  3. DispatcherServlet skaber WebApplicationContext ved at læse WEB-INF / {servletName} -servlet.xml
  4. Endelig blev DispatcherServlet registrerer de bønner, der er defineret i applikationskonteksten

Her er hvordan Spring bootstraps bruger Servlet 3+ tilgang:

  1. Containeren søger efter implementering af klasser ServletContainerInitializer og udfører
  2. Det SpringServletContainerInitializer finder alle klasser implementere WebApplicationInitializer
  3. Det WebApplicationInitializer opretter konteksten med XML eller @Konfiguration klasser
  4. Det WebApplicationInitializer skaber DispatcherServlet med den tidligere oprettede kontekst.

7.2. Hvordan Spring Boot Bootstraps?

Indgangsstedet for en Spring Boot-applikation er den klasse, der er kommenteret med @SpringBootApplication:

@SpringBootApplication public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}

Som standard bruger Spring Boot en indlejret container til at køre applikationen. I dette tilfælde bruger Spring Boot offentlig statisk ugyldig hoved startpunkt for at starte en integreret webserver.

Det tager sig også af binding af Servlet, filter, og ServletContextInitializer bønner fra applikationskonteksten til den integrerede servletbeholder.

En anden funktion ved Spring Boot er, at den automatisk scanner alle klasser i samme pakke eller underpakker i hovedklassen for komponenter.

Spring Boot giver også mulighed for at distribuere det som et webarkiv i en ekstern container. I dette tilfælde er vi nødt til at udvide SpringBootServletInitializer:

@SpringBootApplication public class Application udvider SpringBootServletInitializer {// ...}

Her ser den eksterne servletcontainer efter hovedklassen, der er defineret i META-INF-filen i webarkivet og SpringBootServletInitializer vil sørge for at binde Servlet, filter, og ServletContextInitializer.

8. Emballage og implementering

Lad os endelig se, hvordan en applikation kan pakkes og implementeres. Begge disse rammer understøtter de fælles pakkehåndteringsteknologier som Maven og Gradle. Men når det kommer til implementering, adskiller disse rammer sig meget.

For eksempel giver Spring Boot Maven Plugin Spring Boot support i Maven. Det tillader også emballering af eksekverbar krukke eller krigsarkiver og kørsel af et program "på stedet".

Nogle af fordelene ved Spring Boot i forhold til Spring i forbindelse med implementering inkluderer:

  • Giver indbygget container support
  • Bestemmelse om at køre krukkerne uafhængigt ved hjælp af kommandoen java -jar
  • Mulighed for at udelukke afhængigheder for at undgå potentielle jar-konflikter, når de implementeres i en ekstern container
  • Mulighed for at specificere aktive profiler ved implementering
  • Tilfældig portgenerering til integrationstest

9. Konklusion

I denne vejledning har vi lært om forskellene mellem Spring og Spring Boot.

Med få ord kan vi sige, at Spring Boot simpelthen er en udvidelse af Spring selv for at gøre udvikling, test og implementering mere bekvem.