Spring - 从对象池请求作用域 bean

Spring - Request scoped bean from object pool

我有一个对象资源池:

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,而不是管理池。这种注入应该是请求范围内的,并且在请求完成之后,资源必须返回到池中。这很重要,否则我们最终会 运行 资源不足。

这在 Spring 中可行吗?一直在玩FactoryBean,不过这个好像不支持还豆

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

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

Factory 基本上注入与您在 HandlerInterceptor 中使用的对象相同的对象并创建(或只是 returns)一个 PooledResource.