Java Injectare Dependență – DI Design Model Exemplu Tutorial

Java Injectare Dependență model de design ne permite să scoateți hard-coded dependențe și de a face aplicația noastră slab cuplate, extensibil și de întreținut. Putem implementa dependency injection în java pentru a muta rezoluția de dependență de la compile-time la runtime.,Java Dependency Injection pare greu de înțeles cu teoria, așa că aș lua un exemplu simplu și apoi vom vedea cum să folosim modelul de injecție de dependență pentru a obține cuplarea liberă și extensibilitatea în aplicație.

Să zicem că avem o aplicație care ne consuma EmailService pentru a trimite e-mailuri. În mod normal, am implementa acest lucru ca mai jos.

EmailService clasa deține logica pentru a trimite un mesaj de e-mail la adresa de e-mail a destinatarului., Codul nostru de aplicare va fi ca mai jos.codul nostru de client care va folosi clasa MyApplication pentru a trimite mesaje de e-mail va fi ca mai jos.la prima vedere, nu pare nimic în neregulă cu implementarea de mai sus. Dar logica codului de mai sus are anumite limitări.

  • MyApplication clasa este responsabil pentru a inițializa serviciu de e-mail și apoi să-l utilizați. Acest lucru duce la dependență hard-codificate. Dacă dorim să trecem la un alt serviciu de e-mail avansat în viitor, va necesita modificări de cod în clasa MyApplication., Acest lucru face ca aplicația noastră să fie greu de extins și dacă serviciul de e-mail este utilizat în mai multe clase, atunci ar fi și mai greu.
  • dacă dorim să extindem aplicația noastră pentru a oferi o caracteristică suplimentară de mesagerie, cum ar fi mesajul SMS sau Facebook, atunci va trebui să scriem o altă aplicație pentru asta. Aceasta va implica modificări de cod în clasele de aplicații și în clasele de clienți.testarea aplicației va fi foarte dificilă, deoarece aplicația noastră creează direct instanța serviciului de e-mail. Nu există nici un fel putem bate joc de aceste obiecte în clasele noastre de testare.,

se poate argumenta că putem elimina serviciu de e-mail exemplu crearea de MyApplication clasa de a avea un constructor care necesită servicii de e-mail ca un argument.dar, în acest caz, solicităm aplicațiilor client sau claselor de testare să inițializeze serviciul de e-mail care nu este o decizie bună de proiectare.acum, să vedem cum putem aplica java dependency injection pattern pentru a rezolva toate problemele cu implementarea de mai sus., Dependency Injection în java necesită cel puțin următoarele:

  1. componentele serviciului ar trebui să fie proiectate cu clasa de bază sau interfață. Este mai bine să preferați interfețele sau clasele abstracte care ar defini contractul pentru servicii.
  2. clasele de consum ar trebui să fie scrise în termeni de interfață de serviciu.
  3. clase de injectoare care vor inițializa serviciile și apoi clasele de consumatori.

Java Injectare Dependență de Serviciu Componente

Pentru cazul nostru, putem avea MessageService care va declara contractul pentru implementari de servicii.,

package com.journaldev.java.dependencyinjection.service;public interface MessageService {void sendMessage(String msg, String rec);}

acum să spunem că avem servicii de e-mail și SMS care implementează interfețele de mai sus.serviciile noastre de injecție de dependență java sunt gata și acum putem scrie clasa noastră de consumatori.

Java Injectare Dependență – Consumator de Servicii

Noi nu trebuie să aibă interfețe de bază pentru consum clase dar nu va avea un Consumer interfață declararea contractului de consum clase.

package com.journaldev.java.dependencyinjection.consumer;public interface Consumer {void processMessages(String msg, String rec);}

implementarea clasei mele de consumatori este ca mai jos.

observați că clasa noastră de aplicații utilizează doar serviciul., Nu inițializează serviciul care duce la o mai bună „separare a preocupărilor”. De asemenea, utilizarea interfeței de serviciu ne permite să testăm cu ușurință aplicația batjocorind MessageService și să legăm serviciile în timpul rulării, mai degrabă decât să compilăm timpul.

Acum suntem gata să scrie java dependență injector clase care va inițializa serviciu și, de asemenea, clase de consum.

Java Dependența de Injecție – Injectoare Clase

Să aibă o interfață MessageServiceInjector cu declarația metodă care returnează Consumer clasa.,

package com.journaldev.java.dependencyinjection.injector;import com.journaldev.java.dependencyinjection.consumer.Consumer;public interface MessageServiceInjector {public Consumer getConsumer();}

acum, pentru fiecare serviciu, va trebui să creăm clase de injectoare ca mai jos.

package com.journaldev.java.dependencyinjection.injector;import com.journaldev.java.dependencyinjection.consumer.Consumer;import com.journaldev.java.dependencyinjection.consumer.MyDIApplication;import com.journaldev.java.dependencyinjection.service.EmailServiceImpl;public class EmailServiceInjector implements MessageServiceInjector {@Overridepublic Consumer getConsumer() {return new MyDIApplication(new EmailServiceImpl());}}
package com.journaldev.java.dependencyinjection.injector;import com.journaldev.java.dependencyinjection.consumer.Consumer;import com.journaldev.java.dependencyinjection.consumer.MyDIApplication;import com.journaldev.java.dependencyinjection.service.SMSServiceImpl;public class SMSServiceInjector implements MessageServiceInjector {@Overridepublic Consumer getConsumer() {return new MyDIApplication(new SMSServiceImpl());}}

Acum să vedem cum ne-aplicații client va folosi aplicația cu un program simplu.după cum puteți vedea că clasele noastre de aplicații sunt responsabile numai pentru utilizarea serviciului. Clasele de servicii sunt create în injectoare. De asemenea, dacă trebuie să extindem în continuare aplicația noastră pentru a permite mesageria facebook, va trebui să scriem doar clase de servicii și clase de injectoare.,deci, implementarea injecției de dependență a rezolvat problema cu dependența greu codificată și ne-a ajutat să facem aplicația noastră flexibilă și ușor de extins. Acum, să vedem cât de ușor putem testa clasa noastră de aplicații batjocorind injectorul și clasele de servicii.

Java Dependency Injection-JUnit Test Case with mock Injector și Service

după cum puteți vedea că folosesc clase anonime pentru a bate joc de clasele injectorului și de servicii și pot testa cu ușurință metodele mele de aplicare., Folosesc JUnit 4 pentru clasa de testare de mai sus, așa că asigurați-vă că este în calea dvs. de construire a proiectului dacă rulați deasupra clasei de testare.

am folosit Constructori pentru a injecta dependențele în clasele de aplicații, un alt mod este de a utiliza o metodă setter pentru a injecta dependențele în clasele de aplicații. Pentru injectarea dependenței metodei setter, clasa noastră de aplicații va fi implementată ca mai jos.

package com.journaldev.java.dependencyinjection.injector;import com.journaldev.java.dependencyinjection.consumer.Consumer;import com.journaldev.java.dependencyinjection.consumer.MyDIApplication;import com.journaldev.java.dependencyinjection.service.EmailServiceImpl;public class EmailServiceInjector implements MessageServiceInjector {@Overridepublic Consumer getConsumer() {MyDIApplication app = new MyDIApplication();app.setService(new EmailServiceImpl());return app;}}

unul dintre cel mai bun exemplu de injecție dependență setter este Struts2 Servlet API interfețe conștient.,

dacă se utilizează injecție de dependență bazată pe Constructor sau bazată pe setter este o decizie de proiectare și depinde de cerințele dvs. De exemplu, dacă aplicația mea nu poate funcționa deloc fără clasa de servicii, atunci aș prefera di-ul bazat pe constructor sau altfel aș merge pentru Di-ul bazat pe metoda setter să-l folosească doar atunci când este cu adevărat necesar.injectarea dependenței în Java este o modalitate de a realiza inversarea controlului (IoC) în aplicația noastră prin mutarea obiectelor obligatorii din timpul compilării în timpul rulării., Putem realiza IoC prin modelul fabricii, modelul de proiectare a metodei șablonului, Modelul strategiei și modelul locatorului de servicii.

Izvor de Injectare Dependență, Google Guice și Java EE CDI cadre facilita procesul de injectare dependență prin utilizarea Java Reflection API java și adnotări. Tot ce avem nevoie este să adnotăm câmpul, constructorul sau metoda setter și să le configurăm în fișiere sau clase xml de configurare.,tion

Unele dintre beneficiile de a utiliza Injectare Dependență în Java sunt:

  • Separarea Preocupărilor
  • Șabloane de Cod de reducere în cererea de cursuri pentru că toate lucrările pentru a inițializa dependențe este manipulat de către injector componente
  • componente Configurabile face aplicația ușor extensibil
  • Unitate de testare este ușor cu obiecte machete

Dezavantajele Java Injectare Dependență

Java injectare Dependență are unele dezavantaje:

  • Dacă suprasolicitate, aceasta poate duce la probleme de întreținere, deoarece efectul de modificări sunt cunoscute la runtime.,
  • injecție de dependență în java ascunde dependențele clasei de servicii care pot duce la erori de rulare care ar fi fost prinse la momentul compilării.

asta e tot pentru model de injecție dependență în java. Este bine să o cunoaștem și să o folosim atunci când deținem controlul asupra serviciilor.

Leave a Comment