Java Dependency Injection-DI Design Pattern Example Tutorial (Magyar)

Java Dependency Injection design pattern lehetővé teszi számunkra, hogy távolítsa el a kemény kódolt függőségek, és hogy az alkalmazás lazán kapcsolt, bővíthető és karbantartható. A függőségi befecskendezést java-ban tudjuk végrehajtani, hogy a függőségi felbontást fordításról futásidőre mozgassuk.,

Java Dependency Injection

Java Dependency injection úgy tűnik, nehéz felfogni az elmélet, így vennék egy egyszerű példát, majd meglátjuk, hogyan kell használni függőség injekciós minta eléréséhez laza kapcsolási és bővíthetőség az alkalmazás.

tegyük fel, hogy van egy alkalmazásunk, ahol fogyasztunkEmailService e-mailek küldéséhez. Általában ezt az alábbiak szerint hajtjuk végre.

EmailService osztály tartja a logikát, hogy küldjön egy e-mailt a címzett e-mail címét., A jelentkezési kód lesz, mint az alábbiakban.

aMyApplication osztály az e-mail üzenetek küldéséhez az alábbi lesz.

az első pillantásra úgy tűnik, nincs semmi baj a fenti végrehajtással. De a kód feletti logikának vannak bizonyos korlátai.

  • MyApplication class felelős az e-mail szolgáltatás inicializálásáért, majd használatáért. Ez kemény kódolt függőséghez vezet. Ha a jövőben más fejlett e-mail szolgáltatásra akarunk váltani, akkor kódváltozásokra lesz szükség a MyApplication osztályban., Ez megnehezíti az alkalmazás kiterjesztését, ha az e-mail szolgáltatást több osztályban használják, akkor ez még nehezebb lenne.
  • ha szeretnénk kiterjeszteni az alkalmazás, hogy egy további üzenetküldő funkció, mint például az SMS vagy a Facebook üzenetet, akkor kellene írni egy másik alkalmazás, hogy. Ez magában foglalja a kódváltozásokat az alkalmazásosztályokban, valamint az ügyfélosztályokban is.
  • Az alkalmazás tesztelése nagyon nehéz lesz, mivel alkalmazásunk közvetlenül létrehozza az e-mail szolgáltatási példányt. Nem tudjuk kigúnyolni ezeket a tárgyakat a tesztosztályainkban.,

azzal érvelhetünk, hogy eltávolíthatjuk az e-mail szolgáltatási példány létrehozását a MyApplication osztályból egy olyan konstruktorral, amely érvként e-mail szolgáltatást igényel.

de ebben az esetben ügyfélalkalmazásokat vagy tesztosztályokat kérünk az e-mail szolgáltatás inicializálására, amely nem jó tervezési döntés.

most nézzük meg, hogyan alkalmazhatjuk a java dependency injection pattern-t a fenti implementációval kapcsolatos összes probléma megoldására., A függőségi befecskendezés java-ban legalább a következőket igényli:

  1. a Szervizkomponenseket bázisosztály vagy interfész segítségével kell megtervezni. Jobb, ha inkább interfészeket vagy absztrakt osztályokat szeretne, amelyek meghatározzák a szolgáltatások szerződését.
  2. a fogyasztói osztályokat a szolgáltatási felület szempontjából kell írni.
  3. injektor osztályok, amelyek inicializálják a szolgáltatásokat, majd a fogyasztói osztályokat.

Java Dependency Injection – Service Components

esetünkben lehet MessageService, amely kijelenti a szolgáltatási megvalósításokra vonatkozó szerződést.,

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

most tegyük fel, hogy van e-mail és SMS szolgáltatásunk, amely végrehajtja a fenti interfészeket.

a dependency injection java szolgáltatásaink készen állnak, és most már írhatjuk a fogyasztói osztályunkat.

Java Dependency Injection-Service Consumer

nem szükséges, hogy a bázis interfészek fogyasztói osztályok, de lesz egy Consumer interfész nyilvánító szerződés fogyasztói osztályok.

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

a fogyasztói osztály implementációja az alábbiakban látható.

vegye figyelembe, hogy alkalmazásosztályunk csak a szolgáltatást használja., Nem inicializálja azt a szolgáltatást, amely az aggodalmak jobb “szétválasztásához”vezet. A szolgáltatási felület használata lehetővé teszi számunkra, hogy egyszerűen teszteljük az alkalmazást a MessageService gúnyolódásával, a szolgáltatásokat pedig futásidőben kötjük össze, nem pedig fordítási időben.

most készen állunk java függőségi injektor osztályok írására, amelyek inicializálják a szolgáltatást, valamint a fogyasztói osztályokat.

Java Dependency Injection-Injection-Injectors Classes

let ‘s have an interface MessageServiceInjector with method declaration that returns the class.,

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

most minden szolgáltatáshoz injektorosztályokat kell létrehoznunk, mint az alábbiakban.

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

most nézzük meg, hogy az ügyfélalkalmazások hogyan fogják használni az alkalmazást egy egyszerű programmal.

amint láthatja, hogy alkalmazásosztályaink csak a szolgáltatás használatáért felelősek. A szolgáltatási osztályokat injektorokban hozzák létre. Ha pedig tovább kell bővítenünk az alkalmazásunkat, hogy lehetővé tegyük a facebook üzenetküldését, akkor csak szolgáltatási osztályokat és injektor osztályokat kell írnunk.,

tehát a dependency injection implementációja megoldotta a problémát a kódolt függőséggel, és segített abban, hogy rugalmasabbá és könnyen bővíthető legyen az alkalmazásunk. Most nézzük meg, milyen könnyen tesztelhetjük alkalmazás osztályunkat az injektor és a szervizórák gúnyolódásával.

Java Dependency Injection-JUnit test Case with Mock Injector and Service

mint látható, hogy névtelen osztályokat használok az injektor és a szolgáltatási osztályok kigúnyolására, és könnyen tesztelhetem az alkalmazás módszereimet., A JUnit 4-et használom a fenti tesztosztályhoz, ezért győződjön meg róla, hogy a projekt építési útvonalában van, ha a tesztosztály felett fut.

konstruktorokat használtunk az alkalmazási osztályok függőségeinek befecskendezésére, egy másik módszer egy szetter módszer alkalmazása az alkalmazási osztályok függőségeinek befecskendezésére. A setter method dependency injection esetében az alkalmazásosztályunk az alábbiak szerint kerül végrehajtásra.

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

a szetter függőségi befecskendezés egyik legjobb példája a Struts2 Servlet API Aware interfészek.,

a konstruktor alapú függőségi befecskendezés vagy a szetter alapú használat tervezési döntés, amely az Ön igényeitől függ. Például, ha az alkalmazásom egyáltalán nem működik a szervizosztály nélkül, akkor inkább a konstruktor alapú DI-t részesíteném előnyben, vagy pedig a setter method based DI-t választanám, hogy csak akkor használjam, ha valóban szükség van rá.

Dependency Injection Java egy módja annak, hogy elérjék inverzió vezérlő (Nob) a mi alkalmazás mozgó objektumok kötési fordítási idő futásidejű., Mi lehet elérni Nob keresztül gyári minta, sablon módszer tervezési minta, stratégia minta és szolgáltatás lokátor minta is.

A Spring Dependency Injection, a Google Guice és a Java EE CDI keretrendszerek Java reflexiós API és java annotációk használatával könnyítik meg a függőségi befecskendezés folyamatát. Csak annyit kell tennünk, hogy kommentároljuk a mezőt, a konstruktort vagy a szetter módszert, és konfiguráljuk őket konfigurációs xml fájlokban vagy osztályokban.,ció

Néhány előnyeit használja Függőség Injekció Java:

  • elkülönítésére Vonatkozik
  • Boilerplate Kód csökkenése alkalmazás osztályok, mert csak a munka befejeztével függőségek kezeli a injektor alkatrész
  • Konfigurálható alkatrészek teszi az alkalmazás könnyen kihúzható
  • Egység a vizsgálat egyszerű, a mock objektumok

Hátrányai Java Függőség Injekció

Java Függőség injekció van néhány hátránya is:

  • Ha indokolatlanul, ez ahhoz vezethet, hogy a karbantartási problémák, mert a változások hatása ismert, futásidőben.,
  • Dependency injection in java elrejti a service class függőségek vezethet futásidejű hibák, hogy lett volna fogott fordításkor.

Ez mind a függőségi befecskendezési minta java-ban. Jó tudni és használni, ha mi irányítjuk a szolgáltatásokat.

Leave a Comment