Android
Bibliotheksdolch 2: Abhängigkeitsinjektion in Anwendungen
Suche…
Einführung
Dagger 2 ist, wie auf GitHub erläutert , ein Entwicklungsansatz für die Abhängigkeitsinjektion während der Kompilierung. Um den in Dagger 1.x begonnenen Ansatz zu einem endgültigen Ergebnis zu bringen, beseitigt Dagger 2.x alle Reflexionen und verbessert die Code-Klarheit, indem der traditionelle ObjectGraph
/ Injector
zugunsten der vom Benutzer angegebenen @Component
Schnittstellen entfernt wird.
Bemerkungen
- Bibliotheksaufbau in Anwendung (für Maven-, Gradle- und Java-Projekte)
- Vorteile des Dragger-Einsatzes
- Wichtige Links (für Dokumentation und Demos)
- So integrieren und verwenden Sie Dragger-Komponenten
Dolch 2 API:
Dolch 2 macht einige spezielle Anmerkungen verfügbar:
@Module für die Klassen, deren Methoden Abhängigkeiten bereitstellen
@Liefert die Methoden innerhalb von @Module-Klassen
@Injekt zum Anfordern einer Abhängigkeit (Konstruktor, Feld oder Methode)
@Component ist eine Brückenschnittstelle zwischen Modulen und Injektion
Wichtige Links:
GitHub: https://github.com/google/dagger
UserGuide (Google): https://google.github.io/dagger/users-guide.html
Videos: https://google.github.io/dagger/resources.html
Vogella Tutorial: http://www.vogella.com/tutorials/Dagger/article.html
Codepath-Tutorial: https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2
Erstellen Sie @Module-Klasse und @Singleton-Annotation für Object
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
public class VehicleModule {
@Provides @Singleton
Motor provideMotor(){
return new Motor();
}
@Provides @Singleton
Vehicle provideVehicle(){
return new Vehicle(new Motor());
}
}
Jeder Anbieter (oder jede Methode) muss die Annotation @Provides
und die Klasse die Annotation @Module
. Die Annotation @Singleton
zeigt an, dass es nur eine Instanz des Objekts gibt.
Anfordern von Abhängigkeiten in abhängigen Objekten
Nun, da Sie die Anbieter für Ihre verschiedenen Modelle haben, müssen Sie diese anfordern. So wie Vehicle
Motor
benötigt, müssen Sie die @Inject
Annotation im Vehicle
wie folgt hinzufügen:
@Inject
public Vehicle(Motor motor){
this.motor = motor;
}
@Inject
Annotation @Inject
können Sie Abhängigkeiten im Konstruktor, in Feldern oder in Methoden anfordern. In diesem Beispiel halte ich die Injektion im Konstruktor.
@Module mit @Inject verbinden
Die Verbindung zwischen dem Anbieter von Abhängigkeiten, @Module
, und den Klassen, die sie über @Inject
anfordern, wird mithilfe von @Component
, einer Schnittstelle:
import javax.inject.Singleton;
import dagger.Component;
@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
Vehicle provideVehicle();
}
Für die Annotation @Component
müssen Sie angeben, welche Module verwendet werden sollen. In diesem Beispiel wird VehicleModule
verwendet, das in diesem Beispiel definiert ist. Wenn Sie mehrere Module verwenden müssen, fügen Sie diese einfach mit einem Komma als Trennzeichen hinzu.
Verwenden der @Component-Schnittstelle zum Abrufen von Objekten
Da Sie nun jede Verbindung bereit haben, müssen Sie eine Instanz dieser Schnittstelle abrufen und ihre Methoden aufrufen, um das gewünschte Objekt abzurufen:
VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();
Wenn Sie versuchen, ein neues Objekt der Schnittstelle mit der @Component
Annotation zu erstellen, müssen Sie dies mit dem Präfix Dagger_<NameOfTheComponentInterface>
, in diesem Fall Dagger_VehicleComponent
, Dagger_VehicleComponent
und dann die Builder-Methode verwenden, um jedes Modul darin aufzurufen.