Une différence fondamentale sur la méthode d'injection qui diffère de la manière dont vous semblez être à l'aide de c'est que la méthode d'injection est juste une autre façon pour la Dague à envoyer dans les dépendances lors de la construction ou de l'injection d'un DI-prêt de l'objet, ce qui signifie que @Inject-annoté méthodes sont destinés à être appelé par le Poignard à la fois sur la construction et non pas de l'intérieur de votre propre code. De ce fait, il est très très peu probable que vous le feriez @Inject
-annoter makeDinner
, fryDinner
, ou toute autre méthode significative des effets secondaires ou des valeurs de retour. Au lieu de cela, le traiter de la méthode d'injection en tant que post-facto occasion pour le constructeur de style injection.
public class Chef {
private Provider<Pasta> mPastaProvider;
private Sauce mSauce;
@Inject
public void registerIngredients( // can be named anything
Provider<Pasta> pastaProvider,
Sauce sauce) { // T and Provider<T> both work, of course
mPastaProvider = pastaProvider;
mSauce = sauce;
}
/* Non-@Inject */ public Dinner cookDinner() {
mPan.add(mPastaProvider.get());
mPan.add(mSauce);
return mPan.cookDinner();
}
/* Non-@Inject */ public Dinner fryDinner() {
mPan.add(mPastaProvider.get());
mPan.add(mSauce);
return mPan.fryDinner();
}
}
Dans ce cas, lorsque vous demandez de l'injection d'un Chef, la Dague va voir le @Inject-méthode annotée et de l'appeler. Sauf si vous avez un @Inject-annoté constructeur ou @Fournit la méthode, vous ne serez pas en mesure d'obtenir un Chef directement à partir de votre Composant, mais vous pourriez créer un void
méthode sur le Composant qui reçoit une construite Chef
de l'instance et qui utilise le champ et la méthode d'injection de prévoir que le Chef avec les ingrédients (ou de l'ingrédient Fournisseurs) ils peuvent avoir besoin. (Voir l' @Composant et MembersInjector docs pour plus de détails.)
Notez que, dans aucun cas, ne Dinner
apparaissent sur l'objet graphique! L'ajout de @Injecter à un constructeur indique Poignard qu'il peut utiliser que le constructeur de l'objet disponible sur l'objet graphique, mais en ajoutant @Inject une méthode ou un champ simplement dit Dague dans le cadre du processus d'injection, il doit remplir ce champ ou appelez la méthode avec les dépendances. Si vous voulez faire un Dîner disponible sur l'objet graphique, vous aurez besoin de @Inject-annoter le Dîner constructeur, ou mettre un @Fournit ou @Lie méthode sur un Module que vous nourrissez dans le Composant.
Pourquoi voudriez-vous utiliser? Prenons le cas où les objets sont créés reflectively (par exemple, des Activités, des Fragments, et des Vues de Android, ou des objets Sérialisables), où vous préférez ne pas exposer @Inject champs. Dans ces cas, vous pourriez contourner constructeur de contraintes en ayant votre injection d'arriver sur un terrain. De même, si je n'ai pas essayé cette option, vous pouvez prendre avantage de la hiérarchie de classe à l'occasion d'une méthode d'interface avec @Inject, veiller à ce que si oui ou non vous êtes dans une DI contexte, vous pouvez passer certaines dépendances d'un objet dans le cadre de leur préparation.