2010-03-17 9 views
4

Il semble une question étrange (la réponse évidente serait la production, duh), mais si vous lisez la documentation java:Quelle est la bonne étape à utiliser pour Google Guice en production dans un serveur d'applications?

/** 
    * We want fast startup times at the expense of runtime performance and some up front error 
* checking. 
*/ 
DEVELOPMENT, 

/** 
* We want to catch errors as early as possible and take performance hits up front. 
*/ 
PRODUCTION 

dans un scénario où vous avez un appel sans état à un serveur d'application, la réception initiale méthode (ou là) crée l'injecteur nouveau chaque appel. Si toutes les liaisons de modules ne sont pas nécessaires dans un appel donné, il semble qu'il aurait mieux valu utiliser l'étape de développement (qui est la valeur par défaut) et ne pas prendre le coup de performance, car vous ne le prenez jamais du tout. , et ici la distinction entre "upfront" et "performance d'exécution" est un peu discutable, car c'est un appel. Bien sûr, l'inconvénient semble être que vous perdriez le contrôle d'erreur, ce qui provoquerait un problème par surprise.

Alors la question se résume-t-elle à ce que les hypothèses de ce qui précède soient correctes? Voulez-vous économiser les performances sur un grand nombre de modules lorsque la durée de vie donnée d'un injecteur est d'un appel?

+1

Est-ce que créer un nouvel injecteur pour chaque requête est vraiment ce que vous voulez faire? Ce n'est pas comme ça que nous le faisons (injecteurs modulo pour enfants). –

+0

@Kevin, je serais heureux d'entendre parler de meilleures options dans l'alternative. Notez que l'injecteur a une partie d'état (un jeton d'authentification transmis lors de l'appel) qui doit être différent à chaque appel, il est donc inutile de le stocker dans un static. Bien que je sache que les injecteurs d'enfants existent, je n'ai jamais regardé ce qu'ils peuvent faire pour moi. – Yishai

+0

Envisager l'injection assistée? Ou peut-être un SimpleScope avec une valeur ensemencée? http://code.google.com/p/google-guice/wiki/CustomScopes –

Répondre

4

Il ne devrait pas être nécessaire de créer un injecteur pour chaque requête. Ce n'est pas vraiment la façon dont Guice est destiné à être utilisé - vous ne devriez avoir besoin que d'un injecteur par application. Un injecteur représente réellement la configuration ou le câblage d'une application, et non un état de courte durée. Je suppose que vous devez examiner Guice Scopes.

GuiceServletGuiceServlet vous fournit @RequestScoped qui vous permet de limiter la durée de vie d'un objet à une requête HTTP, ce qui ressemble à ce que vous voulez faire.

Si vous n'êtes pas dans une servlet, vous pouvez toujours définir votre propre custom scope. Ce n'est pas très complexe.

+0

Merci Tim, mais n'est pas une portée comme @RequestScoped la même chose que la création de l'injecteur à chaque fois? Quoi qu'il en soit, la solution que j'ai choisie était de créer un injecteur pour enfant et de garder l'Injecteur dans un état statique. Pas sûr que c'est vraiment 100% EJB spec, mais ça marche. – Yishai

+0

D'une manière limitée, oui c'est. Mais l'utilisation d'un injecteur enfant pour contrôler la portée vous limitera d'autres façons: 1. Vous ne pourrez pas mélanger d'autres étendues, de sorte que les entités @Singleton de l'injecteur enfant seront supprimées. 2. Vous aurez tous les frais généraux de création d'injecteur à chaque demande, ce qui peut être significatif. Une partie du point d'avoir un seul injecteur fait tout le travail de liaison à l'avant. –