gpt4 book ai didi

java - 是否可以在 Guice 的范围末尾自动清理资源?

转载 作者:太空狗 更新时间:2023-10-29 22:41:32 26 4
gpt4 key购买 nike

假设我有一个使用请求范围通过 Guice 注入(inject)的 Closeable 对象:

@Provides @RequestScoped
public MyCloseableResource providesMyCloseableResource(){
return new MyCloseableResourceImpl();
}

是否可以挂接一个清理方法,当范围存在时自动调用我的资源上的 close(),而无需诉诸自定义范围实现?

看自定义scope implementation guide在 Guice wiki 上,它表明应该像这样创建和清理范围:

/**
* 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();
}
}

我想知道是否有办法在内置作用域(尤其是 session 和请求作用域)的 finally 中连接一些自定义清理代码。

如果不可能,是否会存在阻碍这种自动清理的问题?

我找到了在 servlet 容器中实现相同效果的方法 implementing a Filter根据请求创建和清理资源,效果很好,但我很好奇它是否可能与纯 Guice 一起使用。

最佳答案

我自己也遇到过类似的问题,最后推出了一个 Disposable 接口(interface),它只提供一个 public void dispose() 方法。我发现这对于在某处注册监听器并需要在定义的时间注销它们的类特别有值(value)。我已经拥有的是我的 AttributeHolderScope blogged about所以我不会在这里重复那部分。现在唯一缺少的是 AbstractAttributeHolder,如下所示:

/**
* An anstract base class for implementing the {@link AttributeHolder}
* interface which has an implementation of the attribute related methods.
*
* @author Matthias Treydte <waldheinz at gmail.com>
*/
public abstract class AbstractAttributeHolder
implements AttributeHolder, Disposable {

private final Object lock = new Object();
private transient Map<Object, Object> attributes;

public AbstractAttributeHolder() {
this.attributes = new HashMap<Object, Object>();
}

public void replaceAttributes(Map<Object, Object> newAttr) {
synchronized (getAttributeLock()){
this.attributes = newAttr;
}
}

@Override
public Object getAttributeLock() {
return this.lock;
}

@Override
public final void putAttribute(Object key, Object value) {
synchronized (getAttributeLock()) {
attributes.put(key, value);
}
}

@Override
public final boolean hasAttribute(Object key) {
synchronized (getAttributeLock()) {
return attributes.containsKey(key);
}
}

@Override
public final Object getAttribute(Object key) {
synchronized (getAttributeLock()) {
return attributes.get(key);
}
}

@Override
public final Set<Object> getAttributes() {
synchronized (getAttributeLock()) {
return Collections.unmodifiableSet(
new HashSet<Object>(this.attributes.values()));
}
}

@Override
public void dispose() {
synchronized (this.getAttributeLock()) {
for (Object o : this.attributes.values()) {
if (o instanceof Disposable) {
final Disposable d = (Disposable) o;
d.dispose();
}
}

this.attributes.clear();
}
}
}

此类本身实现了 Disposable,因此您可以拥有嵌套范围,当您处理外部范围时,所有嵌套范围,更重要的是,所有实现 Disposable 的注入(inject)实例清理干净。并准确回答您的问题:我认为这对于 Guice 本身提供的 Scope 实现是不可能的,但可以做到。每次我看这段代码时,我都会问自己是否不能用更简洁的方式来完成,但它工作得很好(至少对我而言)。

关于java - 是否可以在 Guice 的范围末尾自动清理资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4634588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com