2009-11-04 8 views
8

¿Existe un patrón recomendado para cerrar/cerrar objetos creados con Guice?Gestión de por vida con Google Guice

El ciclo de vida que estoy con el objetivo de es:

  1. Preparar un módulo de Guice
  2. Crear un inyector
  3. Uso del inyector a través de su código para obtener objetos (injector.getInstance(Foo.class))
  4. ...
  5. Cierre todos los recursos mantenidos por dichos objetos (manejadores de archivos, conexiones TCP, etc.). Quiero que este sea un paso determinista (no "algún día cuando se ejecute el GC").
+0

Es posible que desee añadir un código de ejemplo a su pregunta, porque yo realmente no entiendes lo que quieres decir. – dlinsin

+0

Se agregaron más detalles. – ripper234

+7

"Utilice el inyector a través de su código para obtener objetos (injector.getInstance (Foo.class))" - esto es decididamente * no * cómo Guice, o cualquier DI, está destinado a ser utilizado. Eso es solo un localizador de servicios. Debería estar construyendo su gráfico de objetos y el inyector solo debería crearse y referenciarse en alguna clase de arranque root. – ColinD

Respuesta

2

Quiero que este sea un paso determinista (no "algún día cuando se ejecuta el GC").

Lo sentimos, pero Java no es el idioma adecuado para ti. El marco DI no sabe cuándo se han ido todas las referencias a un objeto. Solo el GC lo sabe.

Si tiene un recurso "que se puede cerrar", utilice el patrón try/finally para cerrarlo (consulte a continuación).

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

Ahora para volver a vender un poco. Guice puede saber cuándo comienza y termina un alcance. Su alcance personalizado podría ejecutar un paso de limpieza cuando termine. Este alcance podría incluso devolver proxies para que los objetos no sean válidos si intenta acceder a ellos fuera del alcance permitido. .

(Ah, y 1 a ColinD - Inyectar proveedores :)

EDITAR: Guiceyfruit costuras que tienen una cierta ayuda para Lifecycles

+2

Creo que esto es solo un malentendido clásico de lo que es el GC (particularmente fácil de cometer este error si has programado en C++). En un lenguaje recogido de basura, el tiempo de vida del objeto/GC no tiene nada que ver con liberar recursos como manejadores de archivos o sockets de red. –

+0

El bloque de código no asigna el objeto, por lo que no es responsable de liberarlo. Específicamente, los singletons (dentro de un módulo de Guice) se obtienen mediante Injector.getInstance(), pero no se deben cerrar después de su uso. – ripper234

+1

Todo este problema depende en gran medida de lo que está haciendo y en qué contexto. Los diferentes objetos tienen diferentes ciclos de vida, diferentes ámbitos, etc. por lo que no hay una solución sencilla. ¿Estás haciendo esto en una aplicación web? ¿Estás hablando principalmente de cerrar singletons al apagar? – ColinD

Cuestiones relacionadas