Hvorfor vælge forår som din Java-ramme?

1. Oversigt

I denne artikel gennemgår vi hovedværdiforslaget fra Spring som en af ​​de mest populære Java-rammer.

Endnu vigtigere vil vi forsøge at forstå årsagerne til, at foråret er vores valgte ramme. Detaljer om foråret og dets bestanddele er blevet bredt dækket i vores tidligere tutorials. Derfor springer vi over de indledende "hvordan" dele og fokuserer mest på "hvorfor".

2. Hvorfor bruge nogen ramme?

Før vi begynder en diskussion især om foråret, skal vi først forstå, hvorfor vi overhovedet skal bruge nogen rammer.

EN programmeringssprog til generelle formål som Java er i stand til at understøtte en lang række applikationer. For ikke at nævne, at Java arbejdes aktivt med og forbedres hver dag.

Derudover er der utallige open source og proprietære biblioteker, der understøtter Java i denne henseende.

Så hvorfor har vi trods alt brug for en ramme? Ærligt talt er det ikke absolut nødvendigt at bruge en ramme til at udføre en opgave. Men det tilrådes ofte at bruge en af ​​flere grunde:

  • Hjælper os fokusere på kerneopgaven snarere end kedelpladen forbundet med det
  • Samler mange års visdom i form af designmønstre
  • Hjælper os med at overholde branchens og lovgivningsmæssige standarder
  • Nedbringer de samlede ejeromkostninger for applikationen

Vi har lige skrabet overfladen her, og vi må sige, at fordelene er svære at ignorere. Men det kan ikke være alle positive, så hvad er fangsten:

  • Tvinger os til skriv en ansøgning på en bestemt måde
  • Binder til en bestemt version af sprog og biblioteker
  • Føjes til applikationens ressourcefodaftryk

Helt ærligt er der ingen sølvkugler i softwareudvikling, og rammer er bestemt ingen undtagelse derfra. Så valget af hvilken ramme eller ingen, der skal drives fra sammenhængen.

Forhåbentlig vil vi være bedre placeret til at træffe denne beslutning med hensyn til Spring i Java i slutningen af ​​denne artikel.

3. Kort oversigt over forårets økosystem

Før vi begynder vores kvalitative vurdering af Spring Framework, skal vi se nærmere på, hvordan Spring økosystem ser ud.

Foråret opstod et eller andet sted i 2003 på et tidspunkt, hvor Java Enterprise Edition udviklede sig hurtigt, og udviklingen af ​​en virksomhedsapplikation var spændende, men alligevel kedelig!

Spring startede som en Inversion of Control (IoC) container til Java. Vi relaterer stadig foråret for det meste til det, og det udgør faktisk kernen i rammen og andre projekter, der er udviklet oven på den.

3.1. Spring Framework

Spring framework er opdelt i moduler, hvilket gør det virkelig nemt at vælge og vælge dele, der skal bruges i enhver applikation:

  • Kerne: Tilbyder kernefunktioner som DI (Dependency Injection), Internationalisering, Validering og AOP (Aspect Oriented Programming)
  • Dataadgang: Understøtter dataadgang via JTA (Java Transaction API), JPA (Java Persistence API) og JDBC (Java Database Connectivity)
  • Web: Understøtter både Servlet API (Spring MVC) og for nylig Reactive API (Spring WebFlux) og understøtter desuden WebSockets, STOMP og WebClient
  • Integration: Understøtter integration til Enterprise Java via JMS (Java Message Service), JMX (Java Management Extension) og RMI (Remote Method Invocation)
  • Test: Bred understøttelse af test af enheder og integration gennem Mock Objects, Test Fixtures, Context Management og Caching

3.2. Forårsprojekter

Men hvad der gør foråret meget mere værdifuldt er et stærkt økosystem, der er vokset omkring det gennem årene, og som fortsætter med at udvikle sig aktivt. Disse er struktureret som forårsprojekter, der er udviklet oven på foråret.

Selvom listen over forårsprojekter er lang, og den fortsætter med at ændre sig, er der et par værd at nævne:

  • Boot: Giver os et sæt stærkt meningsfulde, men udvidelige skabeloner til oprettelse af forskellige projekter baseret på Spring på næsten ingen tid. Det gør det virkelig nemt at oprette enkeltstående Spring-applikationer med indlejret Tomcat eller en lignende container.
  • Cloud: Giver support til let at udvikle nogle af de almindelige distribuerede systemmønstre som service discovery, afbryder og API gateway. Det hjælper os med at skære ned på indsatsen for at implementere sådanne kedelplademønstre på lokale, eksterne eller endda administrerede platforme.
  • Sikkerhed: Giver en robust mekanisme til at udvikle godkendelse og godkendelse af projekter baseret på Spring på en meget tilpasselig måde. Med minimal deklarativ support får vi beskyttelse mod almindelige angreb som sessionfiksering, click-jacking og forfalskning på tværs af websteder.
  • Mobil: Giver mulighed for at registrere enheden og tilpasse applikationsadfærden i overensstemmelse hermed. Derudover understøtter det enhedsbevidst visningsadministration for optimal brugeroplevelse, administrering af webstedsindstillinger og stedskift.
  • Batch: Giver en let ramme til udvikling af batchapplikationer til virksomhedssystemer som dataarkivering. Har intuitiv support til planlægning, genstart, springning, indsamling af målinger og logning. Derudover understøtter opskalering til job med store volumener gennem optimering og partitionering.

Det er overflødigt at sige, at dette er en ganske abstrakt introduktion til, hvad foråret har at tilbyde. Men det giver os tilstrækkelig grund med hensyn til Spring organisation og bredde til at tage vores diskussion videre.

4. Forår i aktion

Det er almindeligt at tilføje et hej-verdensprogram for at forstå enhver ny teknologi.

Lad os se hvordan Foråret kan gøre det til en vandring at skrive et program, der gør mere end bare hej-verden. Vi opretter en applikation, der eksponerer CRUD-operationer som REST-API'er for en domæneenhed som medarbejder bakket op af en in-memory-database. Hvad mere er, vi beskytter vores mutationsendepunkter ved hjælp af grundlæggende godkendelse. Endelig kan ingen applikationer virkelig være komplette uden gode, gamle enhedstest.

4.1. Projektopsætning

Vi opretter vores Spring Boot-projekt ved hjælp af Spring Initializr, som er et praktisk onlineværktøj til bootstrap-projekter med de rigtige afhængigheder. Vi tilføjer Web, JPA, H2 og Security som projektafhængigheder for at få Maven-konfigurationskonfigurationen korrekt.

Flere detaljer om bootstrapping er tilgængelige i en af ​​vores tidligere artikler.

4.2. Domæne Model og Persistence

Med så lidt at gøre, er vi allerede klar til at definere vores domænemodel og vedholdenhed.

Lad os først definere Medarbejder som en simpel JPA-enhed:

@Entity offentlig klasse Medarbejder {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat Lang id; @NotNull privat streng fornavn; @NotNull privat streng efternavn; // Standardkonstruktør, getters og setters}

Bemærk det automatisk genererede id, som vi har inkluderet i vores enhedsdefinition.

Nu skal vi definere et JPA-lager for vores enhed. Det er her Spring gør det virkelig simpelt:

offentlig grænseflade EmployeeRepository udvider CrudRepository {List findAll (); }

Alt hvad vi skal gøre er at definere en grænseflade som denne, og Spring JPA vil give os en implementering med standard- og brugerdefinerede operationer. Helt pænt! Find flere detaljer om at arbejde med Spring Data JPA i vores andre artikler.

4.3. Controller

Nu skal vi definere en webcontroller, der skal rute og håndtere vores indgående anmodninger:

@RestController offentlig klasse EmployeeController {@Autowired privat EmployeeRepository repository; @GetMapping ("/ ansatte") offentlig liste getEmployees () {return repository.findAll (); } // Andre håndterere af CRUD-endepunkter}

Virkelig, alt hvad vi skulle gøre var kommentere klassen og definer routing-metainformation sammen med hver behandlingsmetode.

Arbejde med Spring REST-controllere er dækket af store detaljer i vores tidligere artikel.

4.4. Sikkerhed

Så vi har defineret alt nu, men hvad med at sikre operationer som at oprette eller slette medarbejdere? Vi ønsker ikke uautoriseret adgang til disse slutpunkter!

Spring Security skinner virkelig i dette område:

@EnableWebSecurity offentlig klasse WebSecurityConfig udvider WebSecurityConfigurerAdapter {@Override-beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .authorizeRequests () .antMatchers (HttpMethod.GET, "/ ansatte", "/ ansatte / **") .permitA. anyRequest () .authenticated () .and () .httpBasic (); } // andre nødvendige bønner og definitioner}

Der er flere detaljer her, som kræver opmærksomhed for at forstå, men det vigtigste at bemærke er den deklarative måde, hvorpå vi kun har tilladt GET-operationer ubegrænset.

4.5. Testning

Nu har vi gjort alt, men vent, hvordan tester vi dette?

Lad os se om Spring kan gøre det let at skrive enhedstest til REST-controllere:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) @ AutoConfigureMockMvc offentlig klasse EmployeeControllerTests {@Autowired private MockMvc mvc; @Test @WithMockUser () offentlig ugyldighed givenNoEmployee_whenCreateEmployee_thenEmployeeCreated () kaster undtagelse {mvc.perform (post ("/ workers"). Indhold (ny ObjectMapper (). WriteValueAsString (ny medarbejder ("Første", "Sidste")). csrf ())) .contentType (MediaType.APPLICATION_JSON) .accept (MediaType.APPLICATION_JSON)). og Exppect (MockMvcResultMatchers.status () .isCreated ()). og Expect (jsonPath ("$. firstName", er ("First)" ogExpect (jsonPath ("$. lastName", er ("Last"))); } // andre tests efter behov}

Som vi kan se, Spring giver os den nødvendige infrastruktur til at skrive enkle enheds- og integrationstest som ellers afhænger af den forårskontekst, der skal initialiseres og konfigureres.

4.6. Kørsel af applikationen

Endelig, hvordan kører vi denne applikation? Dette er et andet interessant aspekt af Spring Boot. Selvom vi kan pakke dette som en almindelig applikation og traditionelt implementere på en Servlet-container.

Men hvor er det sjovt det der! Spring Boot leveres med en integreret Tomcat-server:

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

Dette er en klasse, der kommer pre-oprettet som en del af bootstrap og har alle de nødvendige detaljer for at starte denne applikation ved hjælp af den integrerede server.

Desuden kan dette meget tilpasses.

5. Alternativer til foråret

Selvom det er relativt lettere at vælge at bruge en ramme, kan valg mellem rammer ofte være skræmmende for de valg, vi har. Men til det skal vi i det mindste have en grov forståelse af, hvilke alternativer der er til de funktioner, som Spring har at tilbyde.

Som vi diskuterede tidligere, Forårsrammen sammen med sine projekter tilbyder et bredt udvalg for en virksomhedsudvikler at vælge imellem. Hvis vi foretager en hurtig vurdering af nutidige Java-rammer, kommer de ikke engang tæt på det økosystem, som Spring giver os.

For bestemte områder danner de dog et overbevisende argument at vælge som alternativer:

  • Vejledning: Tilbyder en robust IoC-container til Java-applikationer
  • Spil: Helt passende passer ind som en webramme med reaktiv support
  • Dvaletilstand: En etableret ramme for dataadgang med JPA-understøttelse

Bortset fra disse er der nogle nylige tilføjelser, der tilbyder bredere support end et specifikt domæne, men stadig ikke dækker alt, hvad Spring har at tilbyde:

  • Micronaut: En JVM-baseret ramme skræddersyet til cloud-native mikrotjenester
  • Quarkus: En new age Java-stak, der lover at levere hurtigere opstartstid og et mindre fodaftryk

Det er selvfølgelig hverken nødvendigt eller gennemførligt at gentage listen over listen fuldstændigt, men vi får den brede idé her.

6. Så hvorfor vælge forår?

Endelig har vi bygget al den krævede kontekst til at tackle vores centrale spørgsmål, hvorfor Spring? Vi forstår, hvordan en ramme kan hjælpe os med at udvikle komplekse virksomhedsapplikationer.

Desuden forstår vi de muligheder, vi har til specifikke bekymringer som web, dataadgang, integration med hensyn til rammer, især for Java.

Hvor skinner foråret nu blandt alle disse? Lad os udforske.

6.1. Anvendelighed

Et af de vigtigste aspekter af enhver rammes popularitet er, hvor let det er for udviklere at bruge det. Spring igennem flere konfigurationsindstillinger, og Convention over Configuration gør det virkelig let for udviklere at starte og derefter konfigurere præcis, hvad de har brug for.

Projekter som Spring Boot har gjort bootstrapping til et komplekst Spring-projekt næsten trivielt. For ikke at nævne, det har fremragende dokumentation og vejledninger, der hjælper alle med at komme ombord.

6.2. Modularitet

Et andet vigtigt aspekt af Spring's popularitet er dens meget modulære karakter. Vi har muligheder for at bruge hele Spring-rammen eller bare de nødvendige moduler. Desuden kan vi valgfrit inkludere et eller flere forårsprojekter afhængigt af behovet.

Hvad mere er, vi har også mulighed for at bruge andre rammer som dvale eller struts!

6.3. Overensstemmelse

Selvom foråret understøtter ikke alle Jakarta EE-specifikationer, men understøtter alle dets teknologier, forbedrer ofte supporten i forhold til standardspecifikationen, hvor det er nødvendigt. For eksempel understøtter Spring JPA-baserede arkiver og gør det derfor trivielt at skifte udbyder.

Desuden understøtter Spring branchespecifikationer som Reactive Stream under Spring Web Reactive og HATEOAS under Spring HATEOAS.

6.4. Testbarhed

Vedtagelse af enhver ramme afhænger stort set også af, at hvor let det er at teste applikationen bygget oven på den. Forår i kernen fortaler og støtter testdrevet udvikling (TDD).

Forårsapplikation består hovedsagelig af POJO'er, hvilket naturligvis gør enhedstest relativt meget enklere. Spring leverer dog Mock Objects til scenarier som MVC, hvor enhedstestning ellers bliver kompliceret.

6.5 Modenhed

Foråret har en lang historie med innovation, adoption og standardisering. I årenes løb er det blevet moden nok til at blive en standardløsning til de mest almindelige problemer står over for i udviklingen af ​​store applikationer til virksomheder.

Hvad der er endnu mere spændende er, hvor aktivt det udvikles og vedligeholdes. Støtte til nye sprogfunktioner og virksomhedsintegrationsløsninger udvikles hver dag.

6.6. Community Support

Sidst men ikke mindst overlever enhver ramme eller endda bibliotek branchen gennem innovation, og der er ikke noget bedre sted for innovation end samfundet. Foråret er en open source ledet af Pivotal Software og bakket op af et stort konsortium af organisationer og individuelle udviklere.

Dette har betydet, at det forbliver sammenhængende og ofte futuristisk, hvilket fremgår af antallet af projekter under dets paraply.

7. Årsager Ikke at bruge foråret

Der er en bred vifte af applikationer, der kan drage fordel af et andet niveau af Spring-brug, og det ændrer sig så hurtigt som Spring vokser.

Vi skal dog forstå, at Spring som enhver anden ramme er nyttig til at styre kompleksiteten af ​​applikationsudvikling. Det hjælper os med at undgå almindelige faldgruber og holder applikationen vedligeholdelig, når den vokser over tid.

Det her koster en ekstra ressource fodaftryk og indlæringskurve, hvor lille det end måtte være. Hvis der virkelig er en applikation, der er enkel nok og ikke forventes at blive kompleks, kan det måske være mere fordelagtigt at slet ikke bruge nogen ramme!

8. Konklusion

I denne artikel diskuterede vi fordelene ved at bruge en ramme til applikationsudvikling. Vi diskuterede yderligere kort især Spring Framework.

Mens vi var i emnet, kiggede vi også på nogle af de alternative rammer, der var tilgængelige for Java.

Endelig diskuterede vi de grunde, der kan tvinge os til at vælge Spring som den valgte ramme for Java.

Vi skal dog afslutte denne artikel med et råd. Uanset hvor overbevisende det måske lyder, der er normalt ingen enkelt løsning, der passer til alle inden for softwareudvikling.

Derfor skal vi anvende vores visdom i at vælge de enkleste løsninger til de specifikke problemer, vi målretter mod at løse.