Bevezetés a 2. tőrbe

1. Bemutatkozás

Ebben az oktatóanyagban a Dagger 2-t vesszük szemügyre - egy gyors és könnyű függőségi injekciós keretrendszert.

A keretrendszer elérhető mind a Java, mind az Android számára, de a fordítási idejű injektálásból származó nagy teljesítmény az utóbbi számára vezető megoldást jelent.

2. Függőségi injekció

Egy kis emlékeztetőként a Dependency Injection az általánosabb inverziós vezérlés elvének konkrét alkalmazása, amelyben a program folyamatát maga a program vezérli.

Külső összetevőn keresztül valósítja meg, amely biztosítja a más objektumok számára szükséges objektumok (vagy függőségek) példányait.

És a különböző keretek különböző módon valósítják meg a függőség-injektálást. Ezen különbségek közül az egyik legjelentősebb az, hogy az injekció futási vagy fordítási időben történik-e.

A futási idejű DI általában reflexión alapul, amely egyszerűbb, de futás közben lassabb. A futási idejű DI keretrendszerre példa a Spring.

A fordítási idejű DI viszont a kódgeneráláson alapul. Ez azt jelenti, hogy az összes nagy súlyú műveletet az összeállítás során hajtják végre. A fordítási idejű DI növeli a bonyolultságot, de általában gyorsabban teljesít.

A 2. tőr ebbe a kategóriába tartozik.

3. Maven / Gradle konfiguráció

A Tőr használatához egy projektben hozzá kell adnunk a tőr függőség a mi pom.xml:

 com.google.dagger tőr 2.16 

Ezenkívül fel kell vennünk a Tőr-fordítót is, amelyet a jegyzetekkel ellátott osztályok konvertálásához használunk az injekciókhoz használt kódokká:

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

Ezzel a konfigurációval a Maven a létrehozott kódot adja ki target / generált-források / kommentárok.

Emiatt, valószínűleg tovább kell konfigurálnunk az IDE-t ha a kódkitöltési funkcióinak bármelyikét használni akarjuk. Egyes IDE-k közvetlen támogatást nyújtanak az annotációs processzorokhoz, míg másoknak szükség lehet arra, hogy ezt a könyvtárat hozzáadjuk a build útvonalhoz.

Alternatív megoldásként, ha az Androidot a Gradle-vel használjuk, mindkét függőséget belefoglalhatjuk:

fordítás 'com.google.dagger: tőr: 2.16' annotationProcessor 'com.google.dagger: tőr-fordító: 2.16'

Most, hogy a projektünkben van Tőr, hozzunk létre egy minta alkalmazást, hogy lássuk, hogyan működik.

4. Végrehajtás

Például megpróbálunk autót építeni alkatrészeinek befecskendezésével.

Most, A tőr a szokásos JSR-330 kommentárokat használja sok helyen, egy lény @ Injekció.

Hozzáadhatjuk a feljegyzéseket a mezőkhöz vagy a konstruktorhoz. De azóta A tőr nem támogatja az injektálást a magánterületeken, konstruktor injekciót fogunk folytatni a kapszulázás megőrzése érdekében:

közosztályú Car {private Engine motor; saját márka márka; @ Fecskendezzen be nyilvános gépkocsit (Motor motor, Márka márka) {this.motor = motor; ez.márka = márka; } // szerelők és beállítók}

Ezután implementáljuk a kódot az injekció végrehajtásához. Pontosabban létrehozunk:

  • a modul, amely egy osztály, amely biztosítja vagy felépíti az objektumok függőségeit, és
  • a összetevő, amely az injektor előállításához használt interfész

A komplex projektek több modult és komponenst tartalmazhatnak, de mivel egy nagyon alapprogrammal van dolgunk, mindegyikből elég egy.

Nézzük meg, hogyan lehet ezeket megvalósítani.

4.1. Modul

Modul létrehozásához be kell jegyeznünk az osztályt a @ Modul annotáció. Ez a megjegyzés azt jelzi, hogy az osztály a függőségeket elérhetővé teheti a tároló számára:

@Module public class VehiclesModule {}

Azután, hozzá kell adnunk a @ Biztosítja megjegyzés a függőségeinket felépítő módszerekről:

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

Vegye figyelembe azt is, hogy konfigurálhatjuk egy adott függőség hatókörét. Ebben az esetben a szingulett hatókört adjuk meg Márka példány, így az összes autópéldány ugyanazon márkájú objektummal rendelkezik.

4.2. Összetevő

Továbbhaladva létrehozzuk az összetevői felületünket. Ez az osztály generálja az autó példányait, injektálva a függőségeket VehiclesModule.

Egyszerűen fogalmazva szükségünk van egy metódus aláírásra, amely a-t adja vissza Autó és meg kell jelölnünk az osztályt a @Összetevő annotáció:

@Singleton @Component (modulok = VehiclesModule.class) nyilvános felület VehiclesComponent {Car buildCar (); }

Figyelje meg, hogyan adtuk át a modul osztályunkat argumentumként a @Összetevő annotáció. Ha ezt nem tennénk meg, Tőr nem tudná, hogyan építsék fel az autó függőségeit.

Továbbá, mivel modulunk szingulett objektumot biztosít, ugyanazt a hatókört kell megadnunk a komponensünknek, mert A tőr nem engedi, hogy a másolatlan alkatrészek a hatókötésekre utaljanak.

4.3. Ügyfélkód

Végül futhatunk mvn össze az annotációs processzorok elindítása és az injektor kód előállítása érdekében.

Ezután megtaláljuk az összetevő megvalósításunkat ugyanazzal a névvel, mint az interfész, csak előtaggalTőr“:

@Test public void givenGeneratedComponent_whenBuildingCar_thenDependenciesInjected () {VehiclesComponent component = DaggerVehiclesComponent.create (); Autó carOne = komponens.buildCar (); Autó carTwo = komponens.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. Tavaszi analógiák

Akik ismerik a Tavaszt, észrevehettek néhány párhuzamot a két keret között.

Tőrét @ Modul az annotáció a tárolót nagyon hasonló módon ismeri fel egy osztályról, mint Spring bármelyik sztereotípiás kommentárja (például @Szolgáltatás, @Vezérlő…). Hasonlóképpen, @ Biztosítja és @Összetevő szinte egyenértékűek a tavaszival @Bab és @Nézz fel illetőleg.

A tavasznak is megvan @Scope annotáció, korrelálva a @Szingli, bár itt már említsünk meg egy másik különbséget abban, hogy a Spring alapértelmezés szerint szingulett hatókört feltételez, míg a Tőr alapértelmezés szerint a Spring fejlesztők prototípus hatókörének nevezheti, és minden alkalommal a szolgáltató metódusára hivatkozik, amikor függőségre van szükség.

6. Következtetés

Ebben a cikkben áttekintettük a Dagger 2 beállításának és használatának alapvető példáját. Figyelembe vettük a futási és a fordítási idejű injektálás közötti különbségeket is.

Mint mindig, a cikkben szereplő összes kód elérhető a GitHubon.


$config[zx-auto] not found$config[zx-overlay] not found