Java dependence Injection-DI Design Pattern Example Tutorial

Java dependence Injection design patternin avulla voimme poistaa hard-koodatut riippuvuudet ja tehdä sovelluksestamme löyhästi kytketyn, laajennettavan ja ylläpidettävän. Voimme toteuttaa huoltosuhteen ruiskutuksen Javalla siirtääksemme riippuvuussuhteen resoluutiota kääntöajoista juoksuaikaan.,

Java Riippuvuus Injektio

Java Riippuvuus injektio vaikea ymmärtää teoria, joten en olisi ottaa yksinkertainen esimerkki ja sitten näemme, miten käyttää riippuvuus injektio kuvio saavuttaa löysä kytkentä ja laajennettavuuden sovelluksen.

Let ’ s say we have an application where we consume EmailService to send email. Normaalisti toteuttaisimme tämän kuten alla.

EmailService Luokka pitää logiikkana lähettää sähköpostiviesti vastaanottajan sähköpostiosoitteeseen., Sovelluskoodimme on kuin alla.

asiakaskoodimme, joka käyttää MyApplication – luokkaa sähköpostiviestien lähettämiseen, on kuin alla.

ensisilmäyksellä edellä mainitussa toteutuksessa ei tunnu olevan mitään vikaa. Mutta koodilogiikan yläpuolella on tiettyjä rajoituksia.

  • MyApplication luokka on vastuussa alustaa email-palvelun ja käyttää sitä sitten. Tämä johtaa vaikeasti koodattavaan riippuvuuteen. Jos haluamme siirtyä johonkin muuhun edistyneeseen sähköpostipalveluun tulevaisuudessa, se vaatii koodimuutoksia MyApplication-luokassa., Tämä tekee sovelluksemme vaikeaksi laajentaa ja jos sähköpostipalvelua käytetään useissa luokissa, se olisi vielä vaikeampaa.
  • Jos haluamme laajentaa meidän sovellus antaa lisää messaging ominaisuus, kuten TEKSTIVIESTI tai Facebook viesti sitten meidän täytyy kirjoittaa toinen sovellus, että. Tämä edellyttää koodimuutoksia sovellusluokissa ja myös asiakasluokissa.
  • sovelluksen testaaminen tulee olemaan hyvin vaikeaa, sillä sovelluksemme luo suoraan sähköpostipalveluasteen. Emme voi mitenkään pilkata näitä kohteita testikursseillamme.,

voidaan väittää, että voimme poistaa sähköpostipalvelun instanssin luomisen MyApplication – luokasta rakentajalla, joka vaatii sähköpostipalvelua argumenttina.

Mutta tässä tapauksessa, me pyydämme asiakasta sovelluksia tai testi luokat alustetaan email-palvelun, joka ei ole hyvä muotoilu päätös.

nyt katsotaan, miten voimme soveltaa java-riippuvuussuihkutuskuviota ratkaistaksemme kaikki ongelmat edellä mainitulla toteutuksella., Riippuvuus Injektio java vaatii ainakin seuraavat:

  1. Palvelun osat on suunniteltu pohja luokka tai-liitäntä. On parempi suosia rajapintoja tai abstrakteja luokkia, jotka määrittelisivät sopimuksen palveluille.
  2. kuluttajaluokat olisi kirjoitettava palveluliittymän mukaan.
  3. Injektoriluokat, jotka alustavat palvelut ja sitten kuluttajaluokat.

Java Riippuvuus Injektio – Palvelun Komponenttien

– meidän tapauksessa, meillä voi olla MessageService joka julistaa sopimuksen palvelun toteutuksia.,

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

nyt sanotaan, että meillä on sähköposti-ja tekstiviestipalvelut, jotka toteuttavat yllä olevat rajapinnat.

huoltoruiskutuksemme java-palvelut ovat valmiina ja nyt voimme kirjoittaa kuluttajaluokkamme.

Java Riippuvuus Injektio – Palvelun Kuluttajalle

– Meidän ei tarvitse olla pohja rajapinnat kuluttaja-luokissa, mutta minulla on Consumer käyttöliittymä julistaa sopimuksen kuluttaja-luokissa.

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

kuluttajaluokan toteutukseni on kuin alla.

huomaa, että sovellusluokkamme käyttää vain palvelua., Se ei alustaa palvelua, joka johtaa parempaan ”huolien erottamiseen”. Myös palveluliittymän käyttö mahdollistaa sovelluksen helposti testaamisen pilkkomalla Messageserviceä ja sitomalla palvelut ajonaikoina eikä kokoamalla aikaa.

nyt olemme valmiita kirjoittamaan java-riippuvuussuuttimen luokat, jotka alustavat palvelun ja myös kuluttajaluokat.

Java – Huoltoruiskutusluokat

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

Nyt jokainen palvelu, meidän täytyy luoda injector luokkiin kuten alla.

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

katsotaanpa Nyt, miten asiakkaamme sovelluksia käyttää sovellus, jossa on yksinkertainen ohjelma.

kuten näet, sovelluskurssimme ovat vastuussa vain palvelun käytöstä. Palveluluokat syntyvät suuttimissa. Myös jos meidän on laajennettava hakemustamme edelleen, jotta facebook-viestittely olisi mahdollista, meidän on kirjoitettava vain palveluluokkia ja injektoriluokkia.,

Joten riippuvuus injektio täytäntöönpano ratkaista ongelma koodattu riippuvuus ja auttoi meitä tekemään meidän sovellus joustava ja helppo laajentaa. Nyt katsotaan, kuinka helposti voimme testata sovellusluokkaamme pilkkaamalla injektori-ja huoltoluokkia.

Java dependence Injection – JUnit Test Case with Mock Injector and Service

As you can see that I am using anonymous classes to mock the injector and service classes and I can easily test my application methods., Olen käyttäen JUnit 4 edellä test-luokassa, joten varmista, että se on hanke rakentaa polku, jos käytät edellä test-luokassa.

olemme käyttäneet rakentajia antoluokkien riippuvuuksien pistämiseen, toinen tapa on käyttää setter-menetelmää riippuvuuksien pistämiseen annosteluluokissa. Setter-menetelmän riippuvuussuihkutuksessa sovellusluokkamme toteutetaan kuten alla.

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

yksi parhaista esimerkeistä setterin huoltoruiskutuksesta on Struts2 Servlet API Aware-rajapinnat.,

käytetäänkö Constructor-pohjaista huoltosuhdetta vai setter-pohjaista, on suunnittelupäätös ja riippuu tarpeistasi. Esimerkiksi, jos sovellus ei toimi ollenkaan ilman palvelu luokka niin olisin mieluummin rakentaja pohjainen DI-tai muuta haluaisin mennä setteri menetelmä, joka perustuu DI käyttää sitä vain, kun sitä todella tarvitaan.

Riippuvuussuihkutus Jaavalla on tapa saavuttaa inversion of control (Kok) sovelluksessamme siirtämällä esineitä, jotka sitoutuvat käänteisestä ajasta juoksuaikaan., Voimme saavuttaa Kok kautta tehdas kuvio, malli menetelmä suunnittelu kuvio, strategia kuvio ja palvelun paikannin kuvio liian.

Kevätriippuvuusruiskutus, Google Guice ja Java EE CDI-puitteet helpottavat riippuvuusruiskutusprosessia Java Reflection API: n ja java-merkintöjen avulla. Kaikki mitä tarvitsemme on hehkuttaa kentän, konstruktor tai setter menetelmä ja määrittää ne määrityksessä xml tiedostoja tai luokkia.,tion

jotkut hyödyt huoltosuhteen käyttämisestä Javalla ovat:

  • huolien erottaminen
  • Boilerplate-koodin vähentäminen sovellusluokissa, koska kaikki työt riippuvuuksien alustamiseksi hoidetaan injektorikomponentilla

  • Konfiguroitavat komponentit tekevät levityksestä helposti laajennettavissa
  • yksikkötestaus on helppoa pilkkakohteilla

Java-Riippuvuussuihkutuksen haitat

riippuvuuden ruiskutus on myös joitakin haittoja:

  • Ylikäytettynä se voi johtaa kunnossapitoon liittyviin ongelmiin, koska muutosten vaikutus tiedetään ajanhetkellä.,
  • java-Huoltoruiske kätkee palveluluokan riippuvuudet, jotka voivat johtaa juoksuvirheisiin, jotka olisivat jääneet kiinni kääntövaiheessa.

that ’ s all for dependency injection pattern in java. Se on hyvä tietää ja käyttää, kun olemme palveluiden hallinnassa.

Leave a Comment