Question

Je me demande ce que les étendues suivantes ont deux liaisons:

bind(PermissionManager.class).in(Singleton.class);

et

bind(PermissionManager.class);

J'ai lu les Javadocs, ils sont comme suit. Pour singleton:

/**
* Apply this to implementation classes when you want only one instance
* (per {@link Injector}) to be reused for all injections for that binding.
*
* @author crazybob@google.com (Bob Lee)
*/

Pour aucune portée:

/**
* No scope; the same as not applying any scope at all.  Each time the
* Injector obtains an instance of an object with "no scope", it injects this
* instance then immediately forgets it.  When the next request for the same
* binding arrives it will need to obtain the instance over again.
*
* <p>This exists only in case a class has been annotated with a scope
* annotation such as {@link Singleton @Singleton}, and you need to override
* this to "no scope" in your binding.
*
* @since 2.0
*/

Qu'est-ce que cela signifie en termes pratiques? Les singletons sont-ils par client ou par JVM? Pour aucune portée, chaque instance est-elle différente?

Était-ce utile?

La solution

En termes pratiques pour le gin, la portée singleton a le plus de sens lorsqu'elle est considérée par instance client, ou même plus précisément, par instance de ginjecteur. Si vous faites l'erreur de faire deux ginjecteurs par GWT.createIngissant une instance deux fois, vous aurez probablement un `` singleton '' par instance, car chaque ginjector ne peut que garder une trace des instances qu'elle gère.

Donc, chaque fois que votre application se charge, il aura son propre singleton. Si l'utilisateur ouvre la même application deux fois dans deux onglets différents, chacun aura son propre singleton. Vous pouvez considérer chaque onglet comme son propre JVM, car il aura sa propre copie de toutes les classes, et ne pourra pas communiquer ou appeler des méthodes * sur l'autre fenêtre.

Pour non, oui, par défaut, chaque instance est différente. Quand un type est @Injected, ce sera une nouvelle instance là-bas, mais si vous @Inject un Provider pour un champ, chaque fois que vous appelez get() Vous pouvez obtenir une nouvelle instance. Cela peut être utile pour obtenir facilement plusieurs instances nouvellement injectées.

Les singletons sont logiques à utiliser dans deux cas principaux

  • Lorsque l'instance détient un état partagé, cela doit être courant dans de nombreuses injections - le cas le plus courant.
  • Lorsque l'instance est coûteuse à créer - sur le serveur, cela se fait souvent en tant que pool, donc pas plus que des objets x sont créés, mais les objets coûteux sur le client ont tendance à être des vues, avec beaucoup de widgets, et généralement plus d'un n'est pas requis.

* Il est possible d'appeler des méthodes sur une autre fenêtre, mais vous devez utiliser les capacités du navigateur pour cela, en publiant un message, et non en passant simplement un objet dans les deux sens.

Autres conseils

Les singletons ne sont créés qu'une seule fois par le ginjector de niveau supérieur que vous créez (et pour la plupart des applications, vous ne créez qu'un seul ginjecteur).

Les objets noncopés sont créés chaque fois qu'ils sont injectés comme une dépendance dans un autre objet. Ainsi, chaque instance sera différente. Vous n'avez en fait pas besoin d'écrire de liaison (SomeClass.class) si vous ne le tradons pas (ou faites l'une des autres choses que le DSL de liant peut vous laisser faire à une liaison). Le simple fait d'avoir le constructeur par défaut ou d'ajouter @Inject à un constructeur permettra à Gin de le créer.

Généralement, lorsque vous utilisez Guice ou Gin, vous voulez laisser les choses non encopées, sauf si vous avez une bonne raison de ne pas le faire. Je recommanderais de lire sur le Documentation Guice sur les lunettes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top