web-dev-qa-db-fra.com

La méthode d'installation de guice AbstractModule

Que fait la méthode install() de la classe AbstractModule? Quelqu'un peut-il me l'expliquer? À partir des documents que j'ai lus sur le site de guice, tout ce que j'ai pu obtenir était:

Utilise le module donné pour configurer plus de liaisons.

Configurer quelles liaisons exactement? Les liaisons du module installé ou les liaisons de la classe qui a invoqué la méthode d'installation?

35
MykelXIII

install permet la composition: dans sa méthode configure, FooModule peut installer FooServiceModule (par exemple). Cela signifierait qu'un injecteur créé uniquement à partir de FooModule inclura des liaisons et des fournisseurs à la fois dans FooModule et FooServiceModule.

Vous pouvez voir install utilisé pour diviser un module en sous-modules logiques pour faciliter la lisibilité ou les tests, ou pour un module de haut niveau pour s'assurer que ses dépendances sont configurées. Vous pouvez également l'utiliser pour instancier des instances de module avec différents paramètres de constructeur (liaison de plusieurs magasins de données, par exemple), ou pour installer des instances de module générées automatiquement comme celles créées via FactoryModuleBuilder .

La composition du module peut être une épée à double tranchant, car les liaisons en double ne sont pas autorisées: si votre FooModule et BarModule sont tous les deux install le même module dépendant, et les liaisons ne sont pas doublons exacts (par exemple si un module instancie un objet dans sa méthode configure), Guice ne parviendra pas à créer un injecteur qui installe à la fois FooModule et BarModule en raison de la liaison en double. Vous pouvez contourner ce problème en définissant equals et hashCode sur vos modules, ou en gérant votre composition de sorte que tout module soit de niveau supérieur ou installé dans exactement un autre module (mais jamais les deux) .

Voir ce blog archivé ou cette SO pour en savoir plus sur la déduplication des liaisons.

43
Jeff Bowman