Inversia controlului și injectării dependenței în Java / Spring

Cuprins
Aceasta este a patra parte a unei serii de tutoriale axate pe revizuirea subiectelor de bază ale limbajului Java pentru a pregăti cititorul în utilizarea Spring Framework. Prima parte a acestei serii de tutoriale poate fi obținută aici, a doua parte poate fi obținută aici și a treia parte aici. În acest tutorial vom vedea 2 concepte de bază pe care trebuie să le gestionăm dacă dorim să folosim Spring corect: Inversia controlului și injectarea dependenței.
În primul rând, vreau să clarific faptul că aceste concepte sunt mult mai bine explicate de Martin Fowler în acest articol și traduse în spaniolă pe această pagină, dar intenția mea este să încerc să rezum conceptul pentru a-l face ușor de înțeles și pentru a vă economisi puțin citind articol (deși sunteți invitați cordial să-l citiți dacă aveți mai multe întrebări).
Termenul este relativ recent, dar este un model de programare care se întoarce la acele programe create folosind o programare secvențială pură, unde un singur programator (sau grup de programatori) s-a așezat pentru a scrie o serie de pași sau instrucțiuni de calcul pentru a fi efectuate perfect secvență.de la început până la sfârșit cu intenția de a obține un ultim rezultat.
În acest moment (nu credeți că a fost acum mulți ani) apelurile către metode și biblioteci proveneau întotdeauna de la o sursă centrală care se ocupa de manipularea tuturor variabilelor din același program. Ulterior, au fost dezvoltate interfețe grafice care erau însărcinate cu gestionarea intrărilor de date în program, în timp ce fluxul principal al programului era însărcinat cu furnizarea de handler pentru evenimentele care au avut loc în interfața grafică (activează ceva când faceți clic, apăsând această tastă , mutarea mouse-ului etc.) în timp ce interfața este într-o buclă constantă. În acest fel, controlul programului este inversat, interfața grafică este însărcinată cu notificarea fluxului principal despre ce trebuie făcut și cum, fără a fi nevoie să știți exact CUM se face.
Dacă observați, interfețele din Java vă pot ajuta să transferați controlul unei aplicații către agenți externi, dar conceptul este aplicabil firelor de demoni care așteaptă să se declanșeze un eveniment, o clasă care este responsabilă pentru instanțierea și livrarea implementărilor altor clase către programul (modelul din fabrică) și, în esență, orice model care permite transmiterea controlului programului către un agent extern.
Este un anumit tip de inversiune a controlului în care o clasă A nu știe ce obiect va folosi în momentul compilării, ci știe doar acțiunile pe care trebuie să le întreprindă cu acel obiect. Să presupunem următoarea clasă (care se bazează pe clasele create în tutorialul meu anterior):
 public class Draftman {public Square square; publicist Cartoonist () {pătrat = pătrat nou (); } public void MasterDraw () {square.Draw (); }} 

După cum veți vedea, această clasă „desenator” depinde în totalitate de clasa „pătrat”, deoarece este responsabilă de ciclul de viață al obiectului pătrat pe care îl va utiliza ulterior. Acest mod de a crea o clasă „Draftman” este foarte impracticabil deoarece, dacă mai târziu am dori ca desenatorul să deseneze dreptunghiuri sau triunghiuri, ar trebui să modificăm codul de bază pentru a face acest lucru.
În schimb, putem crea o clasă mai reutilizabilă dacă implementăm interfața „Drawable” pe care am creat-o în tutorialul anterior:
 public class Draftsman {desen desenabil public; proiectant public (desenabil d) {desen = d; } public void MasterDrawing () {drawing.Drawing (); }} 

În acest fel obiectele clasei „Draftsman” nu „controlează” obiectul pe care trebuie să-l deseneze, ci știu doar că implementează interfața Drawable și, mai târziu, aceste obiecte „Draftsman” pe care le voi crea în aplicația mea sau că cineva altfel va fi folosit într-o aplicație care accesează biblioteca mea de obiecte, sunt perfect capabili să primească orice obiect care implementează interfața „Drawable”.
În exemplul anterior, aplicăm ceea ce se numește „Iniecția constructorului” deoarece dependența este injectată la nivelul constructorului, dar puteți injecta dependența și prin „Setări” sau, în alte limbaje de programare, puteți injecta parametrii sau interfețele (în Java nu puteți modifica parametrii sau interfețele care acceptă o metodă în timpul rulării, dar Python, de exemplu, permite metodelor să accepte parametrii fără a specifica tipul parametrilor.)
 public class Draftsman {desen desenabil public; public void setDrawing (Drawable d) {desen = d; } public void MasterDrawing () {drawing.Drawing (); }} 

injectarea dependenței permite în esență o separare a funcționalităților programului dvs. Această independență vă permite să vă testați cursurile fără (merită repetată) clasa dvs. să fie legată de nimic. Această independență este una dintre piesele cheie de utilizat Primăvară, componentele depind de cadru și nu de aplicație, puteți crea obiecte care există în afara aplicației dvs. și le puteți utiliza numai atunci când aveți nevoie de ele.
Din următorul tutorial vom începe să lucrăm direct cu Spring și veți vedea cum toate conceptele pe care le-am văzut până acum sunt legate de funcționarea sa și vă vor permite să dobândiți expertiza necesară într-un timp scurt.
Aștept comentariile voastre, Până data viitoare!V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv

Vei ajuta la dezvoltarea site-ului, partajarea pagina cu prietenii

wave wave wave wave wave