1

我有一个资源对象池:

public interface PooledResource {
   ...
}

@Component
public class ResourcePool {
    public PooledResource take()                              { ... }
    public void           give(final PooledResource resource) { ... }
}

目前,我在我的 JAX-RS 端点中使用这个池,如下所示:

@Path("test")
public class TestController {
    @Autowired
    private ResourcePool pool;

    @GET
    Response get() {
        final PooledResource resource = pool.take();
        try {
            ...
        }
        finally {
            pool.give(resource);
        }
    }

}

这工作正常。但是,PooledResource手动请求并被迫不要忘记该finally子句让我感到紧张。我想实现控制器如下:

@Path("test")
public class TestController {
    @Autowired
    private PooledResource resource;

    @GET
    Response get() {
        ...
    }

}

在这里,PooledResource被注入,而不是管理池。这种注入应该是请求范围内的,而且,在请求完成后,资源必须归还给池。这很重要,否则我们最终会耗尽资源。

这在春天可能吗?我一直在玩FactoryBean,但这似乎不支持回馈bean。

4

1 回答 1

2

实现 aHandlerInterceptor并将其注入请求范围的 bean。preHandle调用时,使用正确的值设置 bean 。当afterCompletion被调用时,再次清理它。

请注意,您需要将其与 Bean Factory 结合使用,才能很好地PooledResource注入其他组件。

Factory 基本上注入了与您在 中使用的对象相同的对象,HandlerInterceptor并创建(或仅返回) a PooledResource

于 2017-02-20T09:57:23.873 回答