Programmering

Hva er vår? Komponentbasert utvikling for Java

Våren er kanskje den beste av de komponentbaserte rammene som dukket opp ved begynnelsen av det 21. århundre. Det forbedrer måten utviklere skriver og leverer infrastrukturkode i Java-baserte applikasjoner. Siden oppstarten har Spring blitt anerkjent som et ledende rammeverk for bedriftens Java-utvikling. Som et end-to-end applikasjonsrammeverk, speiler Spring noen av Java EE-funksjonene, men det tilbyr en kombinasjon av funksjoner og programmeringskonvensjoner du ikke finner andre steder.

Denne artikkelen introduserer Spring og dens kjerne programmeringsfilosofi og metodikk: Inversjon av kontroll og avhengighetsinjeksjon. Du kommer også i gang med vårkommentarer og et par praktiske kodingseksempler.

Avhengighetsinjeksjon og inversjon av kontroll

Vårens kjerneide er at i stedet for å administrere objektrelasjoner selv, laster du dem av rammen. Inversjon av kontroll (IOC) er metoden som brukes til å håndtere objektrelasjoner. Avhengighetsinjeksjon er mekanismen for å implementere IOC. Siden disse to begrepene er beslektede, men forskjellige, la oss vurdere dem nærmere:

  • Inversjon av kontroll (IOC) gjør akkurat hva navnet sier: det inverterer det tradisjonelle hierarkiet for kontroll for å oppfylle objektrelasjoner. I stedet for å stole på applikasjonskode for å definere hvordan objekter forholder seg til hverandre, defineres forhold av rammeverket. Som en metode introduserer IOC konsistens og forutsigbarhet for å motsette forhold, men det krever at du som utvikler gir opp litt finkornet kontroll.
  • Avhengighetsinjeksjon (DI) er en mekanisme der rammeverket "injiserer" avhengigheter i appen din. Det er den praktiske implementeringen av IOC. Avhengighetsinjeksjon henger på polymorfisme, i den forstand at det tillater oppfyllelse av en referansetype å endres basert på konfigurasjoner i rammeverket. Rammeverket injiserer variable referanser i stedet for å ha dem manuelt oppfylt i applikasjonskoden.

JSR-330

I likhet med mye i Java-verdenen, har det som begynte som en innovasjon, Spring, delvis blitt absorbert av standardspesifikasjoner. I dette tilfellet er JSR-330 Java-standarden. Det fine med JSR-330-spesifikasjonen er at du kan bruke den andre steder, og vil se den i bruk andre steder, utover våren. Du kan bruke den uten å bruke våren. Imidlertid bringer Spring mye mer til bordet.

Eksempel 1: Fjæravhengighetsinjeksjon

Inversjon av kontroll og avhengighetsinjeksjon forstås best ved å bruke dem, så vi begynner med et raskt programmeringseksempel.

Si at du modellerer en bil. Hvis du modellerer i vanlig gammel Java, kan du ha et grensesnittmedlem på Bil klasse for å referere til en Motor grensesnitt, som vist i liste 1.

Oppføring 1. Objektrelasjoner i vanlig gammel Java

 public Interface Engine () {...} public class Car {private Engine engine; public Engine getEngine () {...} public void setEngine (Engine engine) {...}} 

Oppføring 1 inneholder et grensesnitt for en Motor type, og en klasse for betongen Bil type, som refererer til Motor. (Merk at dette i et reelt programmeringsscenario vil være i separate filer.) Nå når du oppretter en Bil For eksempel vil du angi tilknytningen som vist i oppføring 2.

Oppføring 2. Opprette en bil med motorgrensesnittet

 // ... Car newCar = new Car (); Engine sixCylEngine = new InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Gjør ting med bilen 

Merk at du oppretter Bil motstand først. Deretter lager du et nytt objekt som oppfyller Motor grensesnittet, og tilordne det manuelt til Bil gjenstand. Slik fungerer objektforeninger i vanlig gammel Java.

Modelleringskurs og gjenstander om våren

La oss nå se på det samme eksemplet på våren. Her kan du gjøre noe sånt som det som vises i Oppføring 3. Du starter med Bil klasse, men i dette tilfellet legger du til en kommentar til den: @Injiser.

Oppføring 3. Eksempel på bruk av @Inject-merknaden om våren

 offentlig klasse bil {@Inject private Engine engine; // ...} 

Bruker @Injiser kommentar (eller @Autowired, hvis du foretrekker det) ber Spring om å søke i konteksten og automatisk injisere et objekt i referansen, basert på et sett med regler.

Tenk deretter på @Komponent kommentar, vist i oppføring 4.

Oppføring 4. @Komponentkommentar

 @Komponent offentlig klasse InlineSixCylinderEngine implementerer motor {// ...} 

Kommenterer en klasse med @Komponent forteller Spring at det er tilgjengelig for å oppfylle injeksjoner. I dette tilfellet InlineSixCylEngine vil bli injisert fordi den er tilgjengelig og tilfredsstiller grensesnittkravet til foreningen. På våren kalles dette en "autowired" injeksjon. (Se nedenfor for mer om vårens @Autowired kommentar.)

Frakobling som designprinsipp

Inversjon av kontroll med avhengighetsinjeksjon fjerner en kilde til konkret avhengighet fra koden din. Ingen steder i programmet er det en hardkodet referanse til Motor gjennomføring. Dette er et eksempel på frakobling som et programvare design prinsipp. Å koble applikasjonskoden fra implementeringen gjør koden din enklere å administrere og vedlikeholde. Applikasjonen vet mindre om hvordan delene passer sammen, men det er mye lettere å gjøre endringer når som helst i applikasjonens livssyklus.

@Autowired vs @Inject

@Autowired og @Injiser gjør det samme. Derimot, @Injiser er Java-standardkommentar, mens @Autowired er spesifikk for våren. De tjener begge det samme formålet med å fortelle DI-motoren å injisere feltet eller metoden med et matchende objekt. Du kan bruke en av dem om våren.

Oversikt over vårens rammeverk

Nå som du har sett litt vårkode, la oss ta en oversikt over rammeverket og dets komponenter. Som du kan se, består rammeverket av fire hovedmoduler, som er delt inn i pakker. Våren gir deg en god del fleksibilitet med modulene du vil bruke.

  • Kjernebeholder
    • Kjerne
    • Bønne
    • Kontekst
    • Uttrykksspråk
  • Aspektorientert programmering (AOP)
    • AOP
    • Aspekter
    • Instrumentering
  • Datatilgang og integrering
    • JDBC
    • JPA / ORM
    • JMS
    • Transaksjoner
  • Internett
    • Web / REST
    • Servlet
    • Struts

I stedet for å dekke alt her, la oss komme i gang med to av de mest brukte vårfunksjonene.

Starte et nytt prosjekt: Spring Boot

Vi bruker Spring Boot til å lage et eksempel på et prosjekt, som vi bruker til å demonstrere Spring-funksjoner. Spring Boot gjør det enklere å starte nye prosjekter, som du ser selv. For å begynne, ta en titt på hovedklassen vist nedenfor. I Spring Boot kan vi ta en hovedklasse med en hoved() metode, og velg deretter å kjøre den frittstående, eller pakke for distribusjon i en container som Tomcat.

Oppføring 5 har omrissene til hovedklassen vår, som vil leve etter standarden src / main / java / hallo plassering.

Oppføring 5. Hovedklasse med Spring Boot

 pakke hei; importere org.springframework.boot.SpringApplication; importer org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }} 

Legg merke til to ting om ovennevnte kode: For det første er alt arbeidet abstrahert i rammeverket. Hovedklassen starter opp appen, men den vet ingenting om hvordan appen fungerer eller leverer funksjonaliteten. For det andre, SpringApplication.run () gjør den faktiske jobben med å starte appen og sende inn applikasjon klassen selv. Igjen, arbeidet appen gjør, er ikke tydelig her.

De @SpringBootApplication kommentar pakker inn noen få standardkommentarer og forteller våren å se på pakken der hovedklassen finnes for komponenter. I vårt forrige eksempel, med bil og motor, ville dette tillate Spring å finne alle klassene merket med @Komponent og @Injiser. Selve prosessen, kalt komponentskanning, kan tilpasses.

Du kan bygge appen med standarden mvn ren installasjon, og du kan kjøre det med Spring Boot-målet (mvn spring-boot: run). Før vi gjør det, la oss se på dette programmet pom.xml fil.

Oppføring 6. Starter pom.xml

 com.javaworld what-is-spring 1.0.0 org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE 1.8 org.springframework.boot spring-boot-maven-plugin 

Legg merke til to viktige funksjoner i koden ovenfor:

  1. De foreldre element er avhengig av spring-boot-starter-parent prosjekt. Dette overordnede prosjektet definerer en rekke nyttige standarder, for eksempel standard kompilatornivå på JDK 1.8. For det meste kan du bare stole på at den vet hva den gjør. Som et eksempel kan du utelate versjonsnummeret for mange vanlige avhengigheter, og SpringBootParent vil sette versjonene til å være kompatible. Når du støter på foreldrenes versjonsnummer, vil avhengighetsversjonene og standardinnstillingene også endres.
  2. De spring-boot-maven-plugin tillater kjørbar JAR / WAR-emballasje og på plass løpe (via mvn spring-boot: run kommando).

Legge til vårenett som en avhengighet

Så langt har vi klart å bruke det vårstøvel for å begrense hvor mye arbeid vi legger ned for å få en app i gang. La oss nå legge til en avhengighet og se hvor raskt vi kan få noe i en nettleser.

Oppføring 7. Legge til Spring Web i et prosjekt

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

Merk

Spring vil automatisk oppdage hvilke filer som er endret og kompilere deretter. Du kan bare utføre mvn spring-boot: run for å hente endringer.

Nå som vi har et grunnleggende prosjektoppsett, er vi klare for de to eksemplene våre.

Eksempel 2: Bygg RESTful endpoints med Spring Web

Vi har brukt spring-boot-starter-web å få inn flere avhengigheter som er nyttige for å bygge webapplikasjoner. Deretter oppretter vi en rutebehandler for en URL-bane. Springs webstøtte er en del av Spring MVC (Model-View-Controller) -modulen, men ikke la det bekymre deg: Spring Web har også full og effektiv støtte for å bygge RESTful endpoints.

Klassen hvis jobb det er å stille URL-forespørsler er kjent som en kontrolleren, som vist i Listing 8.

Oppføring 8. Fjær MVC REST-kontroller

 pakke hei; importere org.springframework.stereotype.Controller; importere org.springframework.ui.Model; importer org.springframework.web.bind.annotation.RequestMapping; importer org.springframework.web.bind.annotation.RequestMethod; importer org.springframework.web.bind.annotation.ResponseBody; importer org.springframework.web.bind.annotation.RequestParam; @Controller public class GreetingController {@RequestMapping (value = "/ hi", method = RequestMethod.GET) public String hi (@RequestParam (name = "name", required = false, defaultValue = "JavaWorld") Strengnavn, modellmodell ) {return "Hei" + navn; }} 

@Controller-merknaden

De @Kontrollør kommentar identifiserer en klasse som en kontroller. En klasse merket som en kontroller blir også automatisk identifisert som en komponentklasse, noe som gjør den til en kandidat for automatisk kabling. Uansett hvor denne kontrolleren er nødvendig, blir den koblet til rammen. I dette tilfellet kobler vi det til MVC-systemet for å håndtere forespørsler.

Kontrolleren er en spesialisert type komponent. Den støtter @RequestMapping og @ResponseBody merknader som du ser på hei () metode. Disse kommentarene forteller rammeverket for hvordan du kan tilordne URL-forespørsler til appen.

På dette punktet kan du kjøre appen med mvn spring-boot: run. Når du treffer / hei URL, får du et svar som "Hei, JavaWorld."

Legg merke til hvordan Spring har tatt det grunnleggende om autowiring-komponenter, og levert et helt nettrammeverk. Med våren trenger du ikke å eksplisitt koble noe sammen!

Kommentarene til @Request

De @RequestMapping lar deg definere en behandler for en URL-bane. Alternativene inkluderer å definere HTTP-metoden du vil ha, og det er det vi har gjort i dette tilfellet. Forlater Forespørsel av vil instruere programmet om å håndtere alle HTTP-metodetyper.

De @RequestParam argumentkommentar lar oss kartlegge forespørselsparametrene direkte inn i metodesignaturen, inkludert å kreve visse parametre og definere standardverdier slik vi har gjort her. Vi kan til og med kartlegge et forespørselsorgan til en klasse med @Fotball argumentkommentar.

REST og JSON respons

Hvis du oppretter et REST-endepunkt og vil returnere JSON fra metoden, kan du kommentere metoden med @ResponseBody. Svaret pakkes deretter automatisk som JSON. I dette tilfellet returnerer du et objekt fra metoden.

Bruke MVC med Spring Web

I likhet med Struts kan Spring Web-modulen enkelt brukes til et ekte modell-view-controller-oppsett. I så fall vil du returnere en kartlegging på det gitte malespråket (som Thymeleaf), og Spring vil løse kartleggingen, gi modellen du sender til den og gjengi svaret.

Eksempel 3: Vår med JDBC

La oss nå gjøre noe mer interessant med forespørselsbehandleren: la oss returnere noen data fra en database. For formålet med dette eksemplet bruker vi H2-databasen. Heldigvis støtter Spring Boot in-memory H2 DB ut av esken.

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