Diciamo che ho un oggetto Closeable
iniettato attraverso Guice con richiesta di applicazione:È possibile ripulire automaticamente le risorse alla fine dell'ambito in Guice?
@Provides @RequestScoped
public MyCloseableResource providesMyCloseableResource(){
return new MyCloseableResourceImpl();
}
E 'possibile collegarsi ad Internet un metodo di pulizia che avrebbe chiamare automaticamente close()
sulla mia risorsa, quando esiste la portata, senza ricorrere implementazione di ambito personalizzato?
Guardando la consuetudine scope implementation guide sul wiki Guice, dimostra che gli ambiti dovrebbero essere creati e puliti in questo modo:
/**
* 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();
}
}
Mi chiedo se non v'è modo di agganciare-up un po 'personalizzato clean-up codice nello finally
degli ambiti incorporati (in particolare gli ambiti di sessione e richiesta).
Se non è possibile, potrebbero esserci problemi che potrebbero scoraggiare questo tipo di pulizia automatica?
Ho trovato modi per ottenere lo stesso effetto nei contenitori servlet di implementing a Filter per creare e pulire una risorsa per richiesta, che funziona benissimo ma sono curioso di sapere se è possibile con Guice puro.
Un'implementazione di ambito estendibile, ottima idea! Quindi, per usare questo con scope di richiesta, creo 'MyRequestScope' estendendo la classe scope dal blog, collegandola allo stesso punto del predefinito' RequestScope' (la parte difficile), esegui 'scope.enter()' con ' AbstractAttributeHolder' e assicurati di chiamare 'dispose()' nella fine (o nel 'exit()' di 'MyRequestScope')? Se hai un bel modo di integrare questo potresti condividerlo (il codice e/o le tecniche) per favore? – rodion
Per quanto riguarda il codice relativo alla sincronizzazione, sembra non necessario perché 'AttributeHolder' è sempre accessibile da' ThreadLocal', quindi un'istanza univoca per thread. Mi sto perdendo qualcosa? – rodion
1) Non lo uso in un ambiente servlet, quindi non sono sicuro di come farlo correttamente. – Waldheinz