Digamos que tengo un objeto Closeable
inyectado a través de Guice usando solicitud alcance:¿Es posible limpiar automáticamente los recursos al final del alcance en Guice?
@Provides @RequestScoped
public MyCloseableResource providesMyCloseableResource(){
return new MyCloseableResourceImpl();
}
¿Es posible conectar en marcha un método de limpieza que se llamará automáticamente close()
en mi recurso cuando existe el alcance, sin recurrir a la implementación de alcance personalizado?
En cuanto a la costumbre scope implementation guide en el wiki de Guice, muestra que alcances deben ser creados y limpiados de esta manera:
/**
* Runs {@code runnable} in batch scope.
*/
public void scopeRunnable(Runnable runnable) {
scope.enter();
try {
// explicitly seed some seed objects...
scope.seed(Key.get(SomeObject.class), someObject);
// create and access scoped objects
runnable.run();
} finally {
scope.exit();
}
}
Me pregunto si hay manera de conectar en marcha alguna costumbre limpieza código en el finally
de los ámbitos incorporados (especialmente los ámbitos de sesión y solicitud).
Si no es posible, ¿podría haber problemas que desalienten este tipo de limpieza automática?
He encontrado formas de lograr el mismo efecto en contenedores servlet por implementing a Filter para crear y limpiar un recurso por solicitud, que funciona muy bien, pero tengo curiosidad si es posible con Guice puro.
Implementación de alcance extensible, muy buena idea! Entonces, para usar esto con el alcance de la solicitud, crearía 'MyRequestScope' extendiendo su clase de alcance desde el blog, lo conectaría al mismo lugar que el' RequestScope' predeterminado (la parte difícil), haré 'scope.enter()' con ' AbstractAttributeHolder' y asegúrate de llamar 'dispose()' al final (o en 'exit()' de 'MyRequestScope') Si tiene una buena forma de integrar esto, ¿podría compartirlo (el código y/o las técnicas), por favor? – rodion
En cuanto al código relacionado con la sincronización, parece innecesario porque 'AttributeHolder' siempre se accede desde' ThreadLocal' por lo tanto, una instancia única por subproceso. ¿Me estoy perdiendo de algo? – rodion
1) No uso esto en un entorno Servlet, por lo que no estoy seguro de cómo hacerlo correctamente. – Waldheinz