Úvod do dýky 2

1. Úvod

V tomto výučbe sa pozrieme na Dagger 2 - rýchly a ľahký rámec na injektovanie závislostí.

Rámec je k dispozícii pre Java aj Android, ale vysoký výkon odvodený od vstrekovania v čase kompilácie z neho robí špičkové riešenie.

2. Injekcia závislostí

Len na pripomenutie, Dependency Injection predstavuje konkrétnu aplikáciu všeobecnejšieho princípu inverzie riadenia, pri ktorom je priebeh programu riadený samotným programom.

Implementuje sa prostredníctvom externého komponentu, ktorý poskytuje inštancie objektov (alebo závislostí) potrebných pre iné objekty.

A rôzne rámce implementujú závislosť vkladaním rôznymi spôsobmi. Jedným z najpozoruhodnejších z týchto rozdielov je najmä to, či sa vstrekovanie deje v čase behu alebo v čase kompilácie.

Run-time DI je zvyčajne založený na odraze, ktorý je jednoduchšie použiteľný, ale pomalší za behu. Príkladom run-time DI rámca je Spring.

Na druhej strane DI v kompilácii je založené na generovaní kódu. To znamená, že všetky ťažké operácie sa vykonávajú počas kompilácie. Kompilovaný čas DI zvyšuje zložitosť, ale všeobecne funguje rýchlejšie.

Dýka 2 patrí do tejto kategórie.

3. Konfigurácia Maven / Gradle

Aby sme mohli použiť Dagger v projekte, budeme musieť pridať dýka závislosť na našom pom.xml:

 com.google.dagger dýka 2.16 

Ďalej budeme musieť zahrnúť aj kompilátor Dagger, ktorý sa používa na prevod našich anotovaných tried do kódu použitého pre injekcie:

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

S touto konfiguráciou Maven vygeneruje vygenerovaný kód do cieľ / generované zdroje / anotácie.

Pre tento dôvod, pravdepodobne budeme musieť ďalej konfigurovať naše IDE ak chceme použiť niektorú z jej funkcií na dokončenie kódu. Niektoré IDE majú priamu podporu pre anotačné procesory, zatiaľ čo iné môžu potrebovať, aby sme tento adresár pridali na cestu zostavenia.

Prípadne, ak používame Android s Gradle, môžeme zahrnúť obe závislosti:

kompilácia 'com.google.dagger: dýka: 2,16' anotáciaProcesor 'com.google.dagger: dagger-kompilátor: 2,16'

Teraz, keď máme v našom projekte dýku, vytvorme ukážkovú aplikáciu, aby sme zistili, ako to funguje.

4. Implementácia

Pre náš príklad sa pokúsime vyrobiť auto vstrekovaním jeho komponentov.

Teraz, Dagger používa štandardné anotácie JSR-330 na mnohých miestach jedna bytosť @Inject.

Môžeme pridať anotácie do polí alebo do konštruktora. Ale, odkedy Dagger nepodporuje injekcie na súkromných poliach, pôjdeme na injekciu konštruktora, aby sme zachovali zapuzdrenie:

public class Car {private Engine engine; súkromná značka Brand; @Inject public Car (Engine engine, Brand brand) {this.engine = engine; this.brand = značka; } // zakladatelia a zakladatelia}

Ďalej implementujeme kód na vykonanie injekcie. Konkrétnejšie vytvoríme:

  • a modul, čo je trieda, ktorá poskytuje alebo buduje závislosti objektov, a
  • a zložka, čo je rozhranie používané na generovanie injektora

Komplexné projekty môžu obsahovať viac modulov a komponentov, ale keďže sa zaoberáme veľmi základným programom, stačí jeden z nich.

Pozrime sa, ako ich implementovať.

4.1. Modul

Ak chcete vytvoriť modul, musíme triedu anotovať pomocou @ Modul anotácia. Táto anotácia naznačuje, že trieda môže sprístupniť závislosti pre kontajner:

@Module public class VehiclesModule {}

Potom, musíme pridať @ Poskytuje anotácia k metódam, ktoré vytvárajú naše závislosti:

@Module public class VehiclesModule {@Provides public Engine provideEngine () {return new Engine (); } @Provides @Singleton public Brand provideBrand () {return new Brand ("Baeldung"); }}

Upozorňujeme tiež, že môžeme nakonfigurovať rozsah danej závislosti. V tomto prípade dáme singletonový rozsah nášmu Značka inštancie, takže všetky inštancie automobilov zdieľajú rovnaký objekt značky.

4.2. Komponent

Ďalej ideme vytvárať naše rozhranie komponentov. Toto je trieda, ktorá bude generovať inštancie Car a vkladať závislosti poskytované serverom VozidláModul.

Jednoducho povedané, potrebujeme podpis metódy, ktorý vráti a Auto a musíme triedu označiť @ Komponent anotácia:

@Singleton @Component (moduly = VehiclesModule.class) verejné rozhranie VehiclesComponent {Car buildCar (); }

Všimnite si, ako sme odovzdali našu triedu modulov ako argument pre @ Komponent anotácia. Keby sme to neurobili, Dagger by nevedel, ako vybudovať závislosti na automobile.

Pretože náš modul poskytuje singletonový objekt, musíme dať nášmu komponentu rovnaký rozsah, pretože Dýka neumožňuje, aby nekódované komponenty odkazovali na viazané obaly.

4.3. Kód klienta

Nakoniec môžeme bežať mvn zostaviť za účelom spustenia anotačných procesorov a vygenerovania kódu injektora.

Potom nájdeme našu implementáciu komponentov s rovnakým názvom ako rozhranie, s predponou „Dýka“:

@Test public void givenGeneratedComponent_whenBuildingCar_thenDependenciesInjected () {VehiclesComponent component = DaggerVehiclesComponent.create (); Car carOne = component.buildCar (); Auto carTwo = component.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. Jarné analógie

Tí, ktorí poznajú Spring, si mohli všimnúť nejaké paralely medzi týmito dvoma rámcami.

Dýka @ Modul anotácia umožňuje kontajneru oboznámiť sa s triedou veľmi podobným spôsobom ako s niektorými Springovými stereotypnými anotáciami (napríklad @Služba, @ Kontrolór…). Podobne, @ Poskytuje a @ Komponent sú takmer rovnocenné s jarnými @Bean a @Vyhľadať resp.

Jar má tiež svoje @Rozsah anotácia, korelovaná s @Singleton, aj keď tu si všimnite ešte ďalší rozdiel v tom, že Spring predpokladá štandardne singletonový rozsah, zatiaľ čo Dagger predvolene používa to, čo vývojári Spring môžu označovať ako prototypový rozsah, pričom metódu poskytovateľa vyvolá vždy, keď sa vyžaduje závislosť.

6. Záver

V tomto článku sme si povedali, ako nastaviť a používať Dagger 2 so základným príkladom. Zvažovali sme tiež rozdiely medzi spustením a kompiláciou.

Ako vždy, všetok kód v článku je k dispozícii na GitHub.