【发布时间】:2011-01-08 15:32:10
【问题描述】:
假设我有一个使用请求范围通过 Guice 注入的 Closeable 对象:
@Provides @RequestScoped
public MyCloseableResource providesMyCloseableResource(){
return new MyCloseableResourceImpl();
}
是否可以连接一个清理方法,当范围存在时自动调用我的资源上的close(),而不求助于自定义范围实现?
查看 Guice wiki 上的自定义 scope implementation guide,它表明应该像这样创建和清理范围:
/**
* 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();
}
}
我想知道是否有办法在内置范围(尤其是会话和请求范围)的 finally 中连接一些自定义清理代码。
如果不可能,是否存在阻碍这种自动清理的问题?
我已经通过implementing a Filter 找到了在 servlet 容器中实现相同效果的方法,可以根据请求创建和清理资源,效果很好,但我很好奇它是否可能是纯 Guice。
【问题讨论】: