Uvod u Dagger 2

1. Uvod

U ovom uputstvu ćemo pogledati Dagger 2 - brzi i lagani okvir za ubrizgavanje ovisnosti.

Okvir je dostupan i za Javu i za Android, ali visoke performanse izvedene ubrizgavanjem u vrijeme prevođenja čine ga vodećim rješenjem za potonje.

2. Injekcija ovisnosti

Kao podsjetnik, ubrizgavanje ovisnosti konkretna je primjena općenitijeg principa inverzije upravljanja u kojem tok programa kontrolira sam program.

Provodi se putem vanjske komponente koja pruža instance objekata (ili ovisnosti) potrebnih drugim objektima.

A različiti okviri implementiraju ubrizgavanje ovisnosti na različite načine. Konkretno, jedna od najzapaženijih razlika je da li se ubrizgavanje događa u vrijeme izvođenja ili u vrijeme sastavljanja.

Vrijeme izvođenja DI obično se temelji na refleksiji koja je jednostavnija za upotrebu, ali sporija u vremenu izvođenja. Primjer izvršavanja DI okvira je Proljeće.

S druge strane, vrijeme kompajliranja temelji se na generiranju koda. To znači da se sve teške operacije izvode tijekom sastavljanja. DI za vrijeme kompilacije dodaje složenost, ali općenito izvodi brže.

Bodež 2 spada u ovu kategoriju.

3. Konfiguracija Maven / Gradle

Da bismo koristili Dagger u projektu, morat ćemo dodati bodež ovisnost o našoj pom.xml:

 bodež com.google.dagger 2.16 

Nadalje, trebat ćemo uključiti i kompajler Dagger koji se koristi za pretvaranje naših označenih klasa u kôd koji se koristi za injekcije:

 org.apache.maven.plugins maven-compiler-plugin 3.6.1 com.google.dagger dagger-compiler 2.16 

S ovom konfiguracijom, Maven će generirani kôd poslati u target / generirani izvori / bilješke.

Zbog ovog razloga, vjerojatno ćemo trebati dodatno konfigurirati svoj IDE ako želimo koristiti bilo koju od njegovih značajki za dovršavanje koda. Neki IDE-ovi imaju izravnu podršku za procesore napomena, dok će nam drugi možda trebati da dodamo ovaj direktorij na put izrade.

Ako koristimo Android s Gradleom, možemo uključiti obje ovisnosti:

prevesti 'com.google.dagger: dagger: 2.16' annotationProcessor 'com.google.dagger: dagger-compiler: 2.16'

Sad kad u svom projektu imamo Dagger, stvorimo uzorak aplikacije da vidimo kako to radi.

4. Provedba

Za naš ćemo primjer pokušati izraditi automobil ubrizgavanjem njegovih komponenata.

Sada, Dagger koristi standardne bilješke JSR-330 na mnogim mjestima jedno biće @Ubrizgati.

Bilješke možemo dodati poljima ili konstruktoru. Ali, budući da Bodež ne podržava ubrizgavanje na privatna polja, ići ćemo na ubrizgavanje konstruktora radi očuvanja enkapsulacije:

javni razred automobila {privatni motor motora; marka privatne marke; @ Ubrizgajte javni automobil (motor motora, marka marke) {this.engine = motor; this.brand = brand; } // geteri i postavljači}

Zatim ćemo implementirati kôd za izvođenje injekcije. Točnije, izradit ćemo:

  • a modul, koja je klasa koja pruža ili gradi ovisnosti objekata, i
  • a komponenta, koji je sučelje koje se koristi za generiranje injektora

Složeni projekti mogu sadržavati više modula i komponenata, ali budući da imamo posla s vrlo osnovnim programom, jedan od njih je dovoljan.

Pogledajmo kako ih primijeniti.

4.1. Modul

Da biste stvorili modul, moramo razred označiti s @Modul bilješka. Ova napomena ukazuje da klasa može učiniti ovisnosti dostupnima spremniku:

@Module javna klasa VehiclesModule {}

Zatim, moramo dodati @Provides napomena o metodama koje grade naše ovisnosti:

@Module javna klasa VehiclesModule {@Provides public Engine provideEngine () {return new Engine (); } @Provides @Singleton javna marka provideBrand () {vratiti novu marku ("Baeldung"); }}

Također, imajte na umu da možemo konfigurirati opseg zadane ovisnosti. U ovom slučaju, dajemo singleton opseg našem Marka primjerice, tako da sve instance automobila dijele isti objekt marke.

4.2. Komponenta

Nastavljajući dalje, stvorit ćemo sučelje komponenata. Ovo je klasa koja će generirati instance automobila, ubrizgavajući ovisnosti koje pruža VozilaModul.

Jednostavno rečeno, potreban nam je potpis metode koji vraća a Automobil i moramo razred označiti znakom @Komponenta bilješka:

@Singleton @Component (moduli = VehiclesModule.class) javno sučelje VehiclesComponent {Car buildCar (); }

Primijetite kako smo klasu modula predali kao argument za @Komponenta bilješka. Da to nismo učinili, Dagger ne bi znao kako izgraditi ovisnosti automobila.

Također, budući da naš modul pruža singleton objekt, moramo dati isti opseg našoj komponenti jer Bodež ne dopušta da se neobuzdane komponente odnose na opsege veza.

4.3. Šifra klijenta

Napokon, možemo trčati mvn sastaviti kako bi se pokrenuli procesori napomena i generirao kôd mlaznice.

Nakon toga pronaći ćemo implementaciju naše komponente s istim imenom kao i sučelje, samo s prefiksom „Bodež“:

@Test javna praznina givenGeneratedComponent_whenBuildingCar_thenDependenciesInjected () {VehiclesComponent komponenta = DaggerVehiclesComponent.create (); Automobil carOne = komponenta.buildCar (); Automobil carTwo = komponenta.buildCar (); Assert.assertNotNull (carOne); Assert.assertNotNull (carTwo); Assert.assertNotNull (carOne.getEngine ()); Assert.assertNotNull (carTwo.getEngine ()); Assert.assertNotNull (carOne.getBrand ()); Assert.assertNotNull (carTwo.getBrand ()); Assert.assertNotEquals (carOne.getEngine (), carTwo.getEngine ()); Assert.assertEquals (carOne.getBrand (), carTwo.getBrand ()); }

5. Proljetne analogije

Oni koji su upoznati s Proljećem možda su primijetili neke paralele između dva okvira.

Bodežov @Modul napomena čini spremnik svjesnim klase na vrlo sličan način kao bilo koja proljetna stereotipna bilješka (na primjer, @Servis, @Controller…). Također, @Provides i @Komponenta gotovo su jednake proljetnim @Grah i @Pogledaj odnosno.

Proljeće također ima svoje @Skop bilješka, u vezi s @Singleton, iako ovdje imajte na umu već drugu razliku u tome što Spring pretpostavlja zadani opseg jednotočka, dok Dagger prema zadanim postavkama postavlja ono što programeri Spring mogu nazvati prototipom, pozivajući se na metodu dobavljača svaki put kad je potrebna ovisnost.

6. Zaključak

U ovom smo članku prošli kroz osnovni primjer kako postaviti i koristiti Dagger 2. Također smo uzeli u obzir razlike između vremena izvođenja i ubrizgavanja tijekom sastavljanja.

Kao i uvijek, sav kôd u članku dostupan je na GitHub-u.