Java-Dependency Injection – DI Design Mønster Eksempel Tutorial

Java-Dependency Injection design mønster, der giver os mulighed for at fjerne hard-kodede afhængigheder og gøre vores ansøgning løst koblet, udvides og at vedligeholde. Vi kan implementere afhængighedsindsprøjtning i java for at flytte afhængighedsopløsningen fra kompileringstid til runtime.,

Java Afhængighedsindsprøjtning

Java Afhængighedsindsprøjtning virker svært at forstå med teori, så jeg vil tage et simpelt eksempel, og så vil vi se, hvordan man bruger afhængighedsindsprøjtningsmønster for at opnå løs kobling og udvidbarhed i applikationen.

lad os sige, at vi har en applikation, hvor vi forbruger EmailService for at sende e-mails. Normalt ville vi implementere dette som nedenfor.

EmailService klasse holder logikken til at sende en e-mail-besked til modtagerens e-mail-adresse., Vores applikationskode vil være som nedenfor.

vores klientkode, der vil bruge MyApplication klasse til at sende e-mails vil være som nedenfor.

Ved første øjekast synes der ikke noget galt med ovenstående implementering. Men over kode logik har visse begrænsninger.

  • MyApplication klasse er ansvarlig for at initialisere e-mailtjenesten og derefter bruge den. Dette fører til hårdt kodet afhængighed. Hvis vi ønsker at skifte til en anden avanceret e-mail-tjeneste i fremtiden, vil det kræve kodeændringer i MyApplication class., Dette gør vores applikation svær at udvide, og hvis e-mail-service bruges i flere klasser, ville det være endnu sværere.
  • hvis vi ønsker at udvide vores applikation til at give en ekstra meddelelsesfunktion, såsom SMS eller Facebook-besked, skal vi skrive en anden applikation til det. Dette vil indebære kodeændringer i applikationsklasser og i klientklasser også.
  • test af applikationen vil være meget vanskeligt, da vores applikation direkte opretter e-mail-serviceinstansen. Der er ingen måde, vi kan håne disse objekter i vores testklasser.,

Man kan argumentere for, at vi kan fjerne den e-mail-tjeneste, f.eks skabelse fra MyApplication class ved at have en constructor, der kræver e-mail service som et argument.men i dette tilfælde beder vi klientapplikationer eller testklasser om at initialisere e-mail-tjenesten, der ikke er en god designbeslutning.lad os nu se, hvordan vi kan anvende java afhængighedsindsprøjtningsmønster for at løse alle problemer med ovenstående implementering., Afhængighedsinjektion i java kræver mindst følgende:

  1. Servicekomponenter skal designes med basisklasse eller interface. Det er bedre at foretrække grænseflader eller abstrakte klasser, der ville definere kontrakt for tjenesterne.
  2. Forbrugerklasser skal skrives med hensyn til servicegrænseflade.
  3. Injektorklasser, der initialiserer Tjenesterne og derefter forbrugerklasserne.

Java Dependency Injection – Service Components

For vores tilfælde kan vi haveMessageService, der erklærer kontrakten for serviceimplementeringer.,

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

lad os nu sige, at vi har e-mail-og SMS-tjenester, der implementerer ovenstående grænseflader.

vores afhængighedsindsprøjtning java-tjenester er klar, og nu kan vi skrive vores forbrugerklasse.

Java-Dependency Injection – Service Forbruger

Vi er ikke forpligtet til at have base grænseflader for forbrugeren klasser, men jeg vil have en Consumer interface erklære kontrakten for forbrugeren klasser.

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

min implementering af forbrugerklassen er som nedenfor.

Bemærk, at vores applikationsklasse kun bruger tjenesten., Det initialiserer ikke den service, der fører til bedre “adskillelse af bekymringer”. Brug af servicegrænseflade giver os også mulighed for nemt at teste applikationen ved at spotte MessageService og binde Tjenesterne ved kørsel i stedet for kompileringstid.

nu er vi klar til at skrive java afhængighed injektor klasser, der vil initialisere tjenesten og også forbruger klasser.

Java-Dependency Injection – Injektorer Klasser

Lad os få en grænseflade MessageServiceInjector med metode erklæring, der returnerer Consumer class.,

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

nu for hver tjeneste skal vi oprette injektorklasser som nedenfor.

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());}}

lad os nu se, hvordan vores klientapplikationer vil bruge applikationen med et simpelt program.

som du kan se, at vores applikationsklasser kun er ansvarlige for at bruge tjenesten. Serviceklasser oprettes i injektorer. Også hvis vi er nødt til yderligere at udvide vores applikation for at tillade facebook-beskeder, bliver vi kun nødt til at skrive serviceklasser og injektorklasser.,

så implementering af afhængighedsindsprøjtning løste problemet med hardkodet afhængighed og hjalp os med at gøre vores applikation fleksibel og let at udvide. Lad os nu se, hvor let vi kan teste vores applikationsklasse ved at spotte injektor-og serviceklasserne.

Java-Dependency Injection – JUnit Test Case med Mock Injektor og Service

Som du kan se, at jeg er ved anonyme klasser for at spotte den injektor og service klasser, og jeg kan nemt teste min ansøgning metoder., Jeg bruger JUnit 4 til ovenstående testklasse, så sørg for, at det er i din projektopbygningssti, hvis du kører over testklasse.

Vi har brugt konstruktører til at injicere afhængighederne i applikationsklasserne, en anden måde er at bruge en setter-metode til at injicere afhængigheder i applikationsklasser. For setter metode afhængighed injektion, vores ansøgning klasse vil blive gennemført som nedenfor.

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;}}

et af de bedste eksempler på setter dependency injection er Struts2 Servlet API A .are interfaces.,

om du vil bruge Konstruktørbaseret afhængighedsinjektion eller setter baseret er en designbeslutning og afhænger af dine krav. For eksempel, hvis min applikation slet ikke kan fungere uden serviceklassen, foretrækker jeg konstruktørbaseret DI, ellers ville jeg gå til setter method based DI for kun at bruge den, når det virkelig er nødvendigt.Afhængighedsinjektion i Java er en måde at opnå Inversion af kontrol (IOC) i vores applikation ved at flytte objekter, der binder fra kompileringstid til runtime., Vi kan opnå IOC gennem fabrik mønster, skabelon metode Design Mønster, strategi mønster og Service Locator mønster også.

Forår Dependency Injection, Google Guice og Java EE CDI rammer lette processen af afhængighed injektion ved brug af Java-Reflection API og java anmærkninger. Alt vi behøver er at anmærke feltet, konstruktør eller setter metode og konfigurere dem i konfiguration xml-filer eller klasser.,tion

Nogle af fordelene ved at bruge Afhængighed Injektion i Java, er:

  • Adskillelse af Bekymringer
  • Boilerplate Kode reduktion i anvendelsen klasser, fordi alle arbejde for at initialisere afhængigheder varetages af injektor komponent
  • Konfigurerbare komponenter, der gør anvendelsen let kan udvides
  • Unit testing er nemt med mock objekter

Ulemper ved Java Afhængighed Injektion

Java-Dependency injection har nogle ulemper også:

  • Hvis overbelastet, kan det føre til vedligeholdelse spørgsmål, fordi effekten af ændringer er kendt på runtime.,
  • Afhængighedsindsprøjtning i java skjuler de serviceklasseafhængigheder, der kan føre til runtime-fejl, der ville være blevet fanget på kompileringstidspunktet.

det er alt for afhængighedsindsprøjtningsmønster i java. Det er godt at vide og bruge det, når vi har kontrol over tjenesterne.

Leave a Comment