2009-11-04 13 views
8

Existe-t-il un modèle recommandé pour fermer/fermer des objets créés avec Guice?Gestion à vie avec Google Guice

Le cycle de vie que je vise est:

  1. Préparer un module Guice
  2. Créer un injecteur
  3. Utilisez l'injecteur à travers votre code pour obtenir des objets (injector.getInstance(Foo.class))
  4. ...
  5. Fermez toutes les ressources détenues par les objets (handles de fichiers, connexions TCP, etc ...). Je veux que ce soit une étape déterministe (pas "un jour où le GC fonctionne").
+0

Vous pouvez ajouter quelques exemples de code à votre question, parce que je ne comprends pas vraiment ce que tu veux dire. – dlinsin

+0

Ajout d'un peu plus de détails. – ripper234

+7

"Utilisez l'injecteur à travers votre code pour obtenir des objets (injector.getInstance (Foo.class))" - c'est décidément * pas * comment Guice, ou toute DI, est destiné à être utilisé. C'est juste un localisateur de service. Il devrait construire votre graphe d'objet et l'injecteur ne devrait être créé et référencé que dans une classe de bootstrappeur racine. – ColinD

Répondre

2

Je veux que ce soit une étape déterministe (pas « le jour lors de l'exécution du GC »).

Désolé, mais Java est la mauvaise langue pour vous. Le cadre DI ne sait pas quand toutes les références à un objet ont disparu. Seul le GC le sait.

Si vous avez une ressource "fermable", utilisez le modèle try/finally pour le fermer (voir ci-dessous).

Closable c = // ... 
try { 
    c.use(); 
} finally { 
    c.close(); 
} 

Maintenant à dos colporter un peu. Guice peut savoir quand une portée commence et se termine. Votre étendue personnalisée peut exécuter une étape de nettoyage lorsqu'elle se termine. Cette portée peut même renvoyer des proxys afin que les objets ne soient pas valides si vous avez tenté d'y accéder en dehors de la portée autorisée. .

(Oh et +1 à ColinD - fournisseurs Injecter :)

EDIT: Guiceyfruit coutures d'avoir un soutien pour Lifecycles

+2

Je pense que c'est juste un malentendu classique de ce que le GC est pour (particulièrement facile de faire cette erreur si vous avez programmé en C++). Dans un langage collecté, la durée de vie de l'objet/GC n'a rien à voir avec la libération de ressources telles que les handles de fichiers ou les sockets réseau. –

+0

Le bloc de code n'alloue pas l'objet, il n'est donc pas responsable de sa libération. Spécifiquement singletons (dans un module Guice) sont obtenus par Injector.getInstance(), mais ne devraient pas être fermés après utilisation. – ripper234

+1

Tout ce problème dépend beaucoup de ce que vous faites et dans quel contexte. Différents objets ont des cycles de vie différents, des portées différentes, etc. Il n'y a donc pas de solution facile à attraper. Faites-vous cela dans une webapp? Parlez-vous principalement de la fermeture des singletons à la fermeture? – ColinD