I en verden, hvor vi arbejder med programmeringssprog dagligt, har vi alle en tendens til at søge efter metoder og tricks for at gøre vores liv lette. Afhængighedsinjektion er en sådan teknik, der sigter mod at hjælpe udviklerkoden let ved at levere afhængigheder af et andet objekt. I denne artikel om Hvad er afhængighedsinjektion hjælper jeg dig med at forstå denne teknik i detaljer.
Følgende emner vil blive behandlet i denne artikel:
- Introduktion til afhængighedsinjektion
- Inversion af kontrol
- Typer af afhængighedsinjektion
- Fordele ved afhængighedsinjektion
- Implementer afhængighedsinjektion ved hjælp af Spring Boot
Så lad os komme i gang med denne artikel.
Hvad er afhængighedsinjektion?
Afhængighedsinjektion er et objekts evne til at levere afhængigheder af et andet objekt.
Nu er jeg ret sikker på, at du måske ikke har forstået noget ved ovenstående tekniske definition. Så lad mig rydde forvirringen for dig.
Hvad kommer du i tankerne, når du hører udtrykket afhængighed?
Det er klart, at noget, der stoler på noget andet til støtte, ikke?
Nå, det er det samme, også i tilfælde af programmering.
Afhængighed i programmering er en tilgang, hvor en klasse bruger specifikke funktioner i en anden klasse. Så for eksempel, hvis du overvejer to klasser A og B og siger, at klasse A bruger funktionaliteter i klasse B, så er det underforstået, at klasse A har en afhængighed af klasse B. Hvis du nu koder i Java, skal du vide det skal duOpret en forekomst af klasse B, før objekterne bruges af klasse A.
Så hvis jeg nu skal definere afhængighedsinjektion for dig, kaldes processen med at oprette et objekt til en anden klasse og lade klassen direkte ved hjælp af afhængigheden kaldes afhængighedsinjektion. Det har hovedsagelig tre involverede klasser:
Klientklasse: Dette er den afhængige klasse og afhænger af serviceklassen.
Serviceklasse: Denne klasse leverer en service til klientklassen.
Injektor klasse: Denne klasse er ansvarlig for at indsprøjte serviceklasseobjektet i klientklassen
Nu hvor du har forstået, hvad der er afhængighedsinjektion, lad mig derefter gennemgå det princip, som afhængighedsinjektion er baseret på.
Inversion af kontrol
Som jeg har nævnt ovenfor, er inversion af kontrol et princip, der bygger på, afhængighedsinjektion foretages. Som navnet antyder, bruges Inversion of Control også grundlæggende til at invertere forskellige former for yderligere ansvar for en klasse snarere end hovedansvaret.
Hvis jeg skal forklare dig i enklere termer, så overvej et eksempel, hvor du har evnen til at lave mad. I henhold til IoC-princippet kan du invertere kontrollen, så i stedet for at lave mad kan du bare bestille direkte udefra, hvor du modtager mad lige uden for døren. Således kaldes processen med mad, der leveres til dig lige uden for døren, Inversion of Control.
Du behøver ikke at lave mad selv, i stedet kan du bestille maden og lade en leveringschef, levere maden til dig. På denne måde behøver du ikke tage sig af det ekstra ansvar og bare fokusere på hovedarbejdet.
Nu hvor du kender princippet bag afhængighedsinjektion, lad mig tage dig igennem typerne af afhængighedsinjektion.
Typer af afhængighedsinjektion
Der er hovedsageligt tre typer afhængighedsinjektion:
Konstruktørinjektion: I denne type injektion leverer injektoren afhængighed gennem klientklassekonstruktøren.
Setterinjektion / ejendomsinjektion: I denne type injektion injicerer injektormetoden afhængigheden af settermetoden, der eksponeres af klienten.
Interfaceinjektion: I denne type injektion bruger injektoren Interface til at give afhængighed af klientklassen. Klienterne skal implementere en grænseflade, der afslører ensetter metodehvilkenaccepterer afhængigheden.
Indtil nu håber jeg, du har forstået det faktum, at afhængighedsinjektion er ansvarlig for at skabe objekter, forstå hvilke klasser der kræver disse objekter og til sidst give disse klasser objekterne. Så på den note, lad os derefter se på fordelene ved afhængighedsinjektion.
Fordele ved afhængighedsinjektion
Før jeg opregner fordelene ved Dependency Injection, så lad mig forklare dig behovet for denne injektion på brancheniveau for at hjælpe dig med at forstå fordelene bedre.
Overvej et scenario, hvor du har en e-mail-klasse, hvis eneste ansvar er at tage sig af de modtagne e-mails. Nu vil denne klasse have objekter som 'Til e-mail-adresse', 'Fra e-mail-adresse', 'Emne og e-mailens brødtekst'.
Nu, hvis virksomheden vil gemme tekst- og lydbeskeder, tror du, at denne klasse kan gemme beskeden?
Svaret er nej?
Det skyldes, at e-mail-klassen ikke kan håndtere parametrene for teksten og lydbeskederne. I sådanne tilfælde bliver du nødt til at genskabe klassen. Nu er det ret besværligt at genskabe klassen, især hvis du har brug for det regelmæssigt. I stedet for, hvis du bruger Dependency Injection, kan du ændre objekterne i løbetid. Så på denne måde behøver du ikke genskabe klassen, som yderligere hjælper dig på mange måder.
Så hvis jeg er nødt til at opsummere fordelene ved afhængighedsinjektion, er følgende fordelene:
Okay, så nu hvor du kender fordelene ved afhængighedsinjektion, lad os gå videre og se, hvordan vi implementerer afhængighedsinjektion ved hjælp af Spring Boot.
Hvordan implementeres DI ved hjælp af Spring Boot?
Trin 1: Åben din Formørkelse IDE og opret en Spring Boot ansøgning ved at højreklikke og vælge Spring Starter Project . Nævn derefter projektets navn, og klik på Afslut .
For at få Spring Starter Project skal du installere Spring Tool Suite fra Eclipse Marketplace. Hvis du ikke har Spring Too Suite installeret, kan du henvise til min artikel om .
Du vil automatisk se, at en applikationsfil oprettes som nedenfor.
Trin 2: Opret derefter en klasse i samme pakke. For at gøre det skal du højreklikke på filen -> vælge Klasse og nævne klasse navn. Klik derefter på Afslut . Dette vil skabe en Klasse fil. Her har jeg oprettet en kundeklasse. Se nedenfor.
Trin 3: Lad os derefter indsætte nogle egenskaber til klassen. Så lad os sige, vi inkluderer Kunde-id, kundenavn og Kursus navn. Nævn koden nedenfor.
pakke com.example.demo // pakke navn offentlig klasse Kunder {private int custid private String custname private String coursename}
Trin 3.1: Når du er færdig med det, skal du generere Getter og Setter metoder for disse egenskaber. For at gøre det skal du vælge disse egenskaber og højreklikke. Vælg derefter Kilde -> Generer Getter og Setter metoder.
Din kode indtil nu skal være som følger:
pakke com.example.demo offentlig klasse Kunder {private int custid private String custname private String coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return coursename} public void setCoursename (String coursename) {this.coursename = coursename}}
Overvej nu et scenario, hvor du skal oprette et objekt til kunder, og du ikke ønsker at gøre det manuelt. I et sådant scenario bliver du derefter nødt til at bruge Dependency Injection for at hente objekterne, når du har brug for det.
Så lad os derefter undersøge, hvordan vi kan opnå det samme.
installer php på Windows 10
Trin 4: Først skal du ændre kør linje i ansøgningsklassefil til følgende:
ConfigurableApplicationContext context = SpringApplication.run (DemoApplication.class, args)
Bemærk: Hvis du får en fejl, skal du importere følgende:
import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.context.ConfigurableApplicationContext
Denne ovenstående kodelinje returnerer et objekt på tidspunktet for udførelsen. Tilføj nu følgende kode i applikationsfilen.
kunder c = context.getBean (customers.class)
Ovenstående linje vil bede kompilatoren om at returnere et objekt fra kundeklassen. Se nedenfor.
Trin 4.1: Nu, for at kontrollere, om det fungerer eller ej, dig kan gå tilbage til kundeklassen og tilføj en metode som følger:
offentlig tom visning () {System.out.println ('Objekt returneret med succes')}
Denne metode viser output 'Objekt returneret med succes' ved vellykket udførelse.
Trin 4.2: Derefter skal du gå tilbage til ansøgningsfilen og nævne følgende:
c.display ()
Gennem dette kalder du objektet til klassen Kunder med en reference til visningsmetoden. Se nedenstående billede for koden til applikationsklassen indtil nu:
Nu, hvis du udfører projektet, vil du se en undtagelse af Ingen kvalificerende bønner af typen . Dette skyldes, at den kundeklasse, som du har defineret, ikke er en Spring Bean, dvs. ikke er et Spring Object. Se nedenfor.
Trin 4.3: Så for at fortælle Spring Container det, har vi brug for et objekt fra kundeklassen. For at gøre det skal du nævne @Komponentkommentar , i kundeklassen. Koden i klassen Kunder skal være som nedenfor:
pakke com.example.demo importerer org.springframework.stereotype.Component @Component public class Kunder {private int custid private String custname private String coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname} public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return coursename} public void setCoursename (String coursename) {this.coursename = coursename} public void display () {System.out.println ('Objekt returneres med succes')}}
Så når du nævner kunder c = context.getBean (kunder.klasse) compileren vil kontrollere, om der er en kundebønne tilgængelig i containeren eller ej.
Hvis Bean er tilgængelig, indsprøjter Spring-rammen kundeobjektet i din applikation. Så grundlæggende er dette objekt skabt af Spring-rammen, som kan bruges yderligere i applikationen.
Så hvis jeg udfører dette projekt nu, vil du se et output, der returneres objekt med succes. Se nedenfor.
Dette er grundlæggende, hvordan du kan implementere Dependency Injection.
Eksempel: Afhængighedsinjektion ved hjælp af automatisk ledningsnotering
Jeg håber, du har forstået, hvordan afhængighedsinjektion fungerer i Spring Boot. Lad os nu udvide dette eksempel og se, hvordan en klasse afhængig af den anden klasse brugte funktionerne i denne klasse i Spring Boot.
Trin 1: Opret en ny klassefil igen højreklik på pakken og ved at vælge Ny -> Klasse. Nævn nu klassens navn som nedenfor, og klik på Afslut.
Trin 2: Lad os derefter indsætte nogle egenskaber til klassen. Så lad os sige, vi inkluderer TechID, teknik. Nævn koden nedenfor.
pakke com.example.demo public class Technologies {private int techid private String techname}
Trin 2.1: Når du er færdig med det, skal du generere Getter og Setter metoder for disse egenskaber ved at højreklikke på filen og derefter vælge Kilde -> Generer Getter- og Setter-metoder.
Trin 3: Lad os sige, vi er nødt til at oprette en metode, der udskriver ' Vellykket “. For at gøre det nævner du koden:
public void tech () {System.out.println ('Succesfuld')}
Din kode indtil nu skal se ud som nedenfor:
pakke com.example.demo public class Technologies {private int techid private String techname public int getTechid () {return techid} public void setTechid (int techid) {this.techid = techid} public String getTechname () {return techname} public void setTechname (String techname) {this.techname = techname} public void tech () {System.out.println ('Succesfuld')}}
Trin 4: Nu for at ringe til tech () metode i kundeklasse , skal du oprette et objekt fra teknologiklassen. Så nævn følgende linje kode i kundeklassen:
private Technologies techdetail
Trin 4.1: Når du er færdig med det, skal du generere Getter og Setter metoder for disse egenskaber af højreklik på filen og vælg derefter Kilde -> Generer Getter- og Setter-metoder.
Trin 5: Derefter skal du bruge tech () metode skal du nævne techdetail.tech () under visningsmetode for kundeklassen . Også for at sikre, at techdetail-objektet er instantieret omtale @Komponentkommentar er Teknologiklasse. Se nedenfor.
Nu, når du udfører dette projekt, vil du se en Null Pointer Exception . Dette er fordi nu Kundeklasse er afhængig af teknologiklassen, og alligevel kender den ikke eksistensen af teknologiklassen .
Så for at gøre det muligt for kunden at genkende teknologiklassen, skal du indsætte @Autowired-kommentar i klassen Kunder. Din endelige kode for kundeklassen skal være som følger:
pakke com.example.demo import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @Component public class Kunder {private int custid private String custname private String coursename @Autowired private Technologies techdetail public Technologies getTechdetail ( ) {return techdetail} public void setTechdetail (Technologies techdetail) {this.techdetail = techdetail} public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return coursename} public void setCoursename (String coursename) {this.coursename = coursename} public void display () {System.out.println ( 'Objekt returneres med succes') techdetail.tech ()}}
Når du har udført disse filer, vil du se output som Objekt returneret med succes og vellykket, hvilket betyder, at vores afhængighed af klasserne er opfyldt. Se nedenfor.
Nu hvor du er færdig med artiklen, skal du tjekke af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden.
Har du et spørgsmål til os? Nævn det i kommentarfeltet i dette ”Hvad er afhængighedsinjektion? ”Artikel og vi vender tilbage til dig hurtigst muligt.