Inversion af kontrol og afhængighedsinjektion i Java / Spring

Indholdsfortegnelse
Dette er den fjerde del af en række selvstudier, der fokuserer på at gennemgå de grundlæggende emner i Java -sproget for at forberede læseren i brugen af ​​Spring Framework. Den første del af denne tutorial -serie kan fås her, den anden del kan fås her og den tredje del her. I denne vejledning ser vi 2 grundlæggende begreber, som vi skal håndtere, hvis vi vil bruge Spring korrekt: Inversion af kontrol og afhængighedsinjektion.
Først og fremmest vil jeg præcisere, at disse begreber er meget bedre forklaret af Martin Fowler i denne artikel og oversat til spansk på denne side, men min hensigt er at forsøge at opsummere konceptet for at gøre det let forståeligt og spare dig for lidt at læse artikel (selvom du er hjerteligt inviteret til at læse den, hvis du har flere spørgsmål).
Udtrykket er relativt nyt, men det er et programmeringsmønster, der går tilbage til de programmer, der er oprettet ved hjælp af ren sekventiel programmering, hvor en enkelt programmør (eller en gruppe programmerere) satte sig ned for at skrive en række trin eller beregningsinstruktioner, der skulle udføres perfekt rækkefølge. fra start til slut med det formål at opnå et sidste resultat.
På dette tidspunkt (tror ikke det var mange år siden) kom opkaldene til metoderne og bibliotekerne altid fra en central kilde, der havde ansvaret for at manipulere alle variablerne i det samme program. Senere blev der udviklet grafiske grænseflader, der havde ansvaret for at styre datainput til programmet, mens programmets hovedstrøm var ansvarlig for at levere håndterere til de hændelser, der opstod i den grafiske grænseflade (aktiverer noget ved klik, tryk på denne tast , bevægelse af musen osv.), mens grænsefladen er i en konstant sløjfe. På denne måde vendes styringen af ​​programmet, den grafiske grænseflade er ansvarlig for at underrette hovedstrømmen om, hvad man skal gøre og hvordan uden at skulle vide præcis, HVORDAN det gøres.
Hvis du bemærker det, kan grænseflader i Java hjælpe dig med at overføre kontrol over en applikation til eksterne agenter, men konceptet kan anvendes på dæmontråde, der venter på, at en hændelse skal opstå, en klasse, der er ansvarlig for at instantiere og levere implementeringer af andre klasser til programmet (fabriksmønster) og i det væsentlige ethvert mønster, der gør det muligt at overføre kontrol af programmet til en ekstern agent.
Det er en bestemt type inversion af kontrol, hvor en klasse A ikke ved, hvilket objekt den skal bruge på tidspunktet for kompilering, men kun kender de handlinger, den skal udføre med det objekt. Lad os antage følgende klasse (som er baseret på de klasser, der blev oprettet i min tidligere tutorial):
 offentlig klasse Tegner {public Square square; offentlig tegnefilm () {firkant = ny firkant (); } public void MasterDraw () {square.Draw (); }} 

Som du vil se, afhænger denne "Tegner" -klasse helt af "Square" -klassen, da den har ansvaret for livscyklussen for det firkantede objekt, som den senere vil bruge. Denne måde at oprette en "Tegner" -klasse på er meget upraktisk, for hvis vi senere ville have, at tegneren tegnede rektangler eller trekanter, skulle vi ændre basiskoden for at gøre det.
I stedet kan vi oprette en mere genanvendelig klasse, hvis vi implementerer "Drawable" -grænsefladen, som vi oprettede i den tidligere vejledning:
 offentlig klasse Tegner {offentlig tegning; offentlig tegner (tegningsbar d) {tegning = d; } public void MasterDrawing () {drawing.Drawing (); }} 

På denne måde "kontrollerer" objekterne i "Tegner" -klassen ikke det objekt, de skal tegne, men ved kun, at det implementerer Drawable -grænsefladen og senere disse "Tegner" -objekter, som jeg vil oprette i min applikation eller at nogen ellers går det til at blive brugt i et program, der har adgang til mit objektbibliotek, de er fuldt ud i stand til at modtage ethvert objekt, der implementerer "Drawable" -grænsefladen.
I det foregående eksempel anvender vi det, der er kendt som "Konstruktørinjektion" da afhængigheden injiceres på konstruktorniveau, men du også kan injicere afhængigheden via "Setters", eller i andre programmeringssprog kan du injicere parametrene eller grænsefladerne (I Java kan du ikke ændre parametrene eller de grænseflader, der accepterer en metode i løbetid, men Python giver f.eks. metoder mulighed for at acceptere parametre uden at angive parametertypen.)
 offentlig klasse Tegner {offentlig tegning; public void setDrawing (Drawable d) {drawing = d; } public void MasterDrawing () {drawing.Drawing (); }} 

Det afhængighedsinjektion tillader i det væsentlige en adskillelse af funktionaliteterne i dit program. Denne uafhængighed giver dig mulighed for at teste dine klasser uden (værd at gentage) din klasse er bundet til noget. Denne uafhængighed er en af ​​de vigtigste stykker at bruge Forår, komponenterne afhænger af rammerne og ikke af applikationen, du kan oprette objekter, der findes uden for din applikation og kun bruge dem, når du har brug for dem.
Fra den næste vejledning begynder vi at arbejde direkte med Spring, og du vil se, hvordan alle de koncepter, vi har set hidtil, er relateret til dets drift og giver dig mulighed for at erhverve den nødvendige ekspertise på kort tid.
Jeg afventer dine kommentarer, indtil næste gang!Kan du lide og hjælpe denne vejledning?Du kan belønne forfatteren ved at trykke på denne knap for at give ham et positivt punkt

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave