Guice avides/paresseux singleton instanciations

Je vais avoir quelques problèmes pour comprendre comment Guice singleton instanciations des œuvres. J'ai lu la documentation disponible (ici - http://code.google.com/p/google-guice/wiki/Scopes ), mais je n'arrive toujours pas à comprendre certaines choses:

1) j'ai intégré Guice avec Tomcat, et j'ai mis en place des liaisons dans un ServletModule:

bind(MyServlet.class).asEagerSingleton();
serve("myUrl").with(MyServlet.class);
serve("myOtherUrl").with(MyOtherServlet.class);

(où MyOtherServlet classe a a @Singleton annotation ci-dessus)
Mon intention ici est d'avoir deux servlets, où l'on est avec impatience instancié, tandis que l'autre ne l'est pas. Cependant, il semble que le "servir... avec..." de la ligne automatiquement instancie servlets objets, même si cette classe n'est pas lié qu'un vif singleton.
Le lien que j'ai joint ci-dessus mentionne différence entre Guice cours d'exécution en vertu de la Scène.Le développement et la Scène.Production - toutefois ce encore arrivé, même quand j'ai utilisé explicitement Scène.Développement (qui est celui par défaut de toute façon).
Est-il un moyen pour éviter cela?

2) (continue 1) de veiller à ce que MyServlet est instanciée premier abord, même si toutes les servlets instancier avec impatience maintenant, j'ai modifié l'ordre des modules (et de liaison des états) lors de la création d'un Injecteur, de sorte que la liaison pour MyServlet apparaît en premier. Cependant, j'ai trouvé qu'il obtient toujours instancié plus tard que certains autres liaisons (de non-servlets), qui sont de la forme:

bind(MyInterface.class).to(MyClass.class).asEagerSingleton()

même si ceux-autres liaisons apparu plus tard dans les modules/ordre des liaisons.
J'ai regardé dans, et a constaté que Guice simplement instancie désireux singletons qui ont été tenus par le formulaire de "lier...... asEagerSingleton()" avant qu'il ne ceux de "lier... asEagerSingleton()", et donc je l'ai résolu en modifiant la ligne:
bind(MyServlet.class).asEagerSingleton();
dans:
bind(MyServletDummyInterface.class).(MyServlet.class).asEagerSingleton()

et que effectivement travaillées. Encore, je préfère éviter d'avoir un mannequin interface pour résoudre ce problème, donc je me demandais si quelqu'un avait une meilleure solution..?

3) j'ai deux Guice modules - un ServletModule et un AbstractModule.
Le ServletModule configureServlets() a la suite de liaison:

serve("aUrl").with(SomeServlet.class);

La AbstractModule de configurer() a la suite de liaisons:

bind(SomeImpl.class).asEagerSingleton();
bind(SomeInterface.class).to(SomeImpl.class).in(Singleton.class);

En outre, La SomeServlet classe a injecté un champ de type SomeInterface, et a un @Singleton annotation sur le dessus de la classe.

Maintenant, on pourrait s'attendre à ce que lors de la création d'un injecteur, le SomeImpl classe obtiendrez instancié, et la même instance sera injectée dans le SomeServlet instance. Comme mentionné précédemment, les servlets délimitée avec un "servir... avec..." semblent également obtenir avec impatience instancié, mais de toute façon, il devrait encore être un seul SomeImpl objet instancié. Pourtant, pour une raison quelconque, j'en ai deux SomeImpl objets instanciés lors de cette opération.
Pour la contourner, j'ai mélangé les deux lignes dans la fonction configure() un peu, et au lieu de le ci-dessus j'ai eu il y les lignes suivantes:

bind(SomeImpl.class).in(Singleton.class)
bind(SomeInterface.class).to(SomeImpl.class).asEagerSingleton();

et puis il a bien fonctionné, et j'ai eu une seule instance de SomeImpl instancié. Je ne comprends pas trop pourquoi le commutateur doit question - je peux voir comment celui-ci est le "mieux", mais je m'attends à la fois de travailler correctement, donc je me demandais simplement si je reçois quelque chose de mal ici..?

Désolé pour la longueur,

Merci pour l'aide!

OriginalL'auteur user976850 | 2011-11-08