L'injection de dépendance est un modèle de conception logicielle visant à rendre nos applications couplées, extensibles et faciles à maintenir. Dans ce didacticiel, vous apprendrez à gérer l’injection de dépendance à l'aide de Dagger 2..
Lorsque vous avez un objet qui a besoin d'un autre objet ou qui en dépend pour faire son travail, vous avez une dépendance. Les dépendances peuvent être résolues en laissant l'objet dépendant créer la dépendance ou en demandant à un objet fabrique d'en créer une. Dans le contexte de l'injection de dépendance, cependant, les dépendances sont fournies à la classe qui en a besoin pour éviter que la classe elle-même n'ait à les créer. De cette façon, vous créez un logiciel faiblement couplé et hautement maintenable..
Ce didacticiel utilise la dernière version de Dagger, Dagger 2. Au moment de la rédaction de ce document, Dagger 2 n’est pas encore officiellement publié et est en phase pré-alpha. Cependant, il est utilisable et stable. Vous pouvez visiter Dagger sur GitHub pour avoir des nouvelles du projet et des dates possibles pour la sortie officielle..
Vous aurez besoin de la dernière version d'Android Studio installée sur votre ordinateur de développement, que vous pouvez télécharger depuis le site Web d'Android Developer..
La dague 2 expose un certain nombre d'annotations spéciales:
@Module
pour les classes dont les méthodes fournissent des dépendances@Provides
pour les méthodes à l'intérieur @Module
Des classes@Injecter
demander une dépendance (un constructeur, un champ ou une méthode)@Composant
est une interface de pont entre les modules et l'injectionCe sont les annotations les plus importantes à connaître pour démarrer avec l'injection de dépendance à l'aide de Dagger 2. Je vais vous montrer comment les utiliser dans une simple application Android..
Pour implémenter Dagger 2 correctement, vous devez suivre ces étapes:
@Module
annotation, en utilisant le @Provides
annotation pour chaque méthode qui retourne une dépendance.@Injecter
annotation.@Composant
annotation et ajouter les classes avec le @Module
annotation créée à la deuxième étape.@Composant
interface pour instancier l'objet dépendant avec ses dépendances.L'analyse des dépendances est décalée du temps d'exécution au temps de compilation. Cela signifie que vous êtes averti des problèmes éventuels pendant la phase de développement, contrairement à d'autres bibliothèques, telles que Guice. Avant d'utiliser la bibliothèque Dagger 2, vous devez préparer votre installation Android Studio pour accéder aux classes générées..
Créez une nouvelle application à l'aide d'Android Studio et nommez-la. J'ai nommé mon projet TutsplusDagger.
Met le SDK minimum pour le projet API 10 pour atteindre autant d'appareils que possible.
Choisir la Blanc mise en page pour l'activité que vous créez. Pour ce tutoriel, vous n'avez pas besoin d'une mise en page spéciale.
Nommez l'activité Activité principale
et cliquez terminer.
Une fois le projet créé, vous devez apporter quelques modifications aux fichiers de gradation. Faisons ces changements dans la prochaine étape.
Nous devons modifier le projet build.gradle fichier comme indiqué ci-dessous.
buildscript repositories jcenter () dépendances classpath 'com.android.tools.build:gradle:1.0.0' classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.4' toutprojects repositories mavenCentral ( ) maven url 'https://oss.sonatype.org/content/repositories/snapshots/'
Prenons un instant pour voir quels changements nous avons apportés:
Ouvrir build.gradle dans le dossier d'applications de votre projet et modifiez-le comme indiqué ci-dessous.
apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' android compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig applicationId "com.androidheroes.tutsplusdagger" minSdkVersion 10 versionSite 21 1.0 " buildTypes release minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' dépendances compiler fileTree (dir: 'libs', include: ['* .jar'] ]) compiler 'com.android.support:appcompat-v7:21.0.3' compiler 'com.google.dagger: dagger: 2.0-SNAPSHOT' apt 'com.google.dagger: compilateur de dagues: 2.0-SNAPSHOT' fourni ' org.glassfish: javax.annotation: 10.0-b28 '
Au début du fichier, j'applique le nouveau plugin. Assurez-vous de mettre le nouveau plugin (com.neenbedankt.android-apt) ci-dessous ou après le plugin Android. Si vous ne le faites pas, des erreurs apparaîtront lors de la synchronisation du projet avec les fichiers de gradation..
Dans les dépendances J'ai ajouté:
Après avoir mis à jour la configuration de Dagger, vous pouvez synchroniser le projet avec les fichiers de gradation en cliquant sur le bouton en haut..
À ce stade, vous avez un projet vide prêt à être utilisé dans votre application. Si vous voyez des erreurs, assurez-vous que vous avez correctement suivi les étapes ci-dessus. Nous pouvons maintenant procéder à la mise en œuvre de notre exemple de projet.
Pour ce tutoriel, je vais travailler avec deux classes, Véhicule
et Moteur
. Moteur
est la classe indépendante et Véhicule
est la classe dépendante. Je vais commencer à créer ce modèle dans un nouveau package appelé modèle
.
C'est ce que le Moteur
la classe ressemble à:
package com.androidheroes.tutsplusdagger.model; / ** * Créé par kerry le 14/02/15. * / public class Motor private int rpm; moteur public () this.rpm = 0; public int getRpm () return rpm; public void accelerate (valeur int) rpm = rpm + valeur; frein vide public () rpm = 0;
Cette classe a un seul attribut appelé rpm
, que je vais modifier à travers le accélérer
et frein
méthodes. Et je vais vérifier la valeur actuelle en utilisant le getRpm
méthode.
C'est ce que le Véhicule
la classe ressemble à:
package com.androidheroes.tutsplusdagger.model; / ** * Créé par kerry le 14/02/15. * / public class Vehicle moteur privé; Véhicule public (moteur) this.motor = motor; public void augmentationSpeed (valeur int) motor.accelerate (valeur); public void stop () motor.brake (); public int getSpeed () return motor.getRpm ();
Dans cette classe, vous pouvez voir que je ne crée pas un nouvel objet du Moteur
classe, même si j'utilise ses méthodes. Dans une application du monde réel, cette classe devrait avoir plus de méthodes et d'attributs, mais restons simples pour l'instant.
@Module
ClasseVous devez maintenant créer une classe avec le @Module
annotation. Cette classe va fournir les objets dont vous aurez besoin avec ses dépendances satisfaites. Pour cela, vous devez créer un nouveau paquet (juste le garder en ordre), nommez-le module
et ajoutez une nouvelle classe à l'intérieur comme suit:
package com.androidheroes.tutsplusdagger.module; import com.androidheroes.tutsplusdagger.model.Motor; import com.androidheroes.tutsplusdagger.model.Vehicle; importer javax.inject.Singleton; importer poignard.Module; importer poignard.Provides; / ** * Créé par kerry le 14/02/15. * / @Module public class VehicleModule @Provides @Singleton Motor fourMotor () return new Motor (); @Provides @Singleton Vehicle offerVehicle () return new Vehicle (nouveau moteur ()));
Comme je l'ai spécifié dans Étape 1,Véhicule
Besoins Moteur
pour fonctionner correctement. C’est pourquoi vous devez créer deux fournisseurs, un pour Moteur
(le modèle indépendant) et un autre pour Véhicule
(indiquant sa dépendance).
N'oubliez pas que chaque fournisseur (ou méthode) doit avoir le @Provides
annotation et la classe doit avoir le @Module
annotation. le @Singleton
une annotation indique qu'il n'y aura qu'une seule instance de l'objet.
Maintenant que vous avez les fournisseurs pour vos différents modèles, vous devez les demander. Tout comme Véhicule
Besoins Moteur
, vous devez ajouter le @Injecter
annotation dans le Véhicule
constructeur comme suit:
@Inject Public Vehicle (Motor moteur) this.motor = motor;
Vous pouvez utiliser le @Injecter
une annotation pour demander des dépendances dans le constructeur, les champs ou les méthodes. Dans ce cas, je garde l'injection dans le constructeur.
@Modules
Avec @Injecter
La connexion entre le fournisseur de dépendances, @Module
, et les classes qui les demandent à travers @Injecter
est fabriqué en utilisant @Composant
, qui est une interface:
package com.androidheroes.tutsplusdagger.component; import com.androidheroes.tutsplusdagger.model.Vehicle; import com.androidheroes.tutsplusdagger.module.VehicleModule; importer javax.inject.Singleton; importer poignard.Component; / ** * Créé par kerry le 14/02/15. * / @Singleton @Component (modules = VehicleModule.class) interface publique VehicleComponent Vehicle supplyVehicle ();
À côté de la @Composant
annotation, vous devez spécifier quels modules seront utilisés, dans ce cas, j'utilise VehicleModule
, que nous avons créé plus tôt. Si vous devez utiliser plus de modules, ajoutez-les simplement en utilisant une virgule comme séparateur.
Dans l'interface, ajoutez des méthodes pour chaque objet dont vous avez besoin et il vous en donnera automatiquement une avec toutes ses dépendances satisfaites. Dans ce cas, je n'ai besoin que d'un Véhicule
objet, c'est pourquoi il n'y a qu'une seule méthode.
@Composant
Interface pour obtenir des objetsMaintenant que toutes les connexions sont prêtes, vous devez obtenir une instance de cette interface et appeler ses méthodes pour obtenir l'objet dont vous avez besoin. Je vais l'implémenter dans le onCreate
méthode dans le Activité principale
comme suit:
package com.androidheroes.tutsplusdagger; importer android.support.v7.app.ActionBarActivity; importer android.os.Bundle; importer android.widget.Toast; importer com.androidheroes.tutsplusdagger.component.Dagger_VehicleComponent; importer com.androidheroes.tutsplusdagger.component.VehicleComponent; import com.androidheroes.tutsplusdagger.model.Vehicle; import com.androidheroes.tutsplusdagger.module.VehicleModule; public class MainActivity étend ActionBarActivity Véhicule véhicule; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); Composant VehicleComponent = Dagger_VehicleComponent.builder (). VehicleModule (new VehicleModule ()). Build (); véhicule = composant.fournisseurVéhicule (); Toast.makeText (this, String.valueOf (vehicle.getSpeed ()), Toast.LENGTH_SHORT) .show ();
Lorsque vous essayez de créer un nouvel objet de l’interface avec le @Composant
annotation, vous devez le faire en utilisant le préfixe Poignard_
, dans ce cas Dagger_VehicleComponent
, et ensuite utiliser le constructeur
méthode pour appeler chaque module dans.
Vous pouvez voir que la magie a lieu à la ligne 23. Vous ne demandez qu’un seul objet de la classe. Véhicule
et la bibliothèque est chargée de satisfaire toutes les dépendances dont cet objet a besoin. Encore une fois, vous pouvez voir qu'il n'y a pas de nouvelle instanciation d'aucun autre objet - tout est géré par la bibliothèque.
Vous pouvez maintenant exécuter l'application et l'essayer sur votre appareil ou dans un émulateur. Si vous avez suivi le tutoriel pas à pas, vous verrez un Pain grillé
message indiquant la valeur initiale ou la rpm
variable.
Dans le projet attaché, vous pouvez voir une interface utilisateur personnalisée pour le Activité principale
classe, dans laquelle vous pouvez modifier la valeur du rpm
variable en appuyant sur les boutons sur l'écran.
L'injection de dépendance est un modèle que vous devrez implémenter tôt ou tard dans vos propres applications. Avec Dagger 2, vous disposez d'une bibliothèque facile à utiliser pour l'implémenter. J'espère que vous avez trouvé ce tutoriel utile et n'oubliez pas de le partager si vous l'avez aimé..
Un excellent moyen de progresser en tant que développeur Android consiste à utiliser des modèles d'application Android pour démarrer vos projets. Vous pouvez trouver des modèles de jeux ou d’autres applications, des éléments d’interface utilisateur individuels, etc..
Ou si vous voulez quelque chose de complètement personnalisé selon vos spécifications, vous pouvez engager un développeur Android sur Envato Studio pour faire quelque chose, des ajustements et des corrections de bugs à la création d'une application complète à partir de rien..