Spring - 从对象池请求scoped bean

时间:2017-02-20 07:56:39

标签: java spring autowired object-pooling requestscope

我有一个资源对象池:

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,但这似乎不支持回赠豆。

1 个答案:

答案 0 :(得分:2)

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

请注意,您需要将其与Bean Factory结合使用,以便在其他组件中获得良好的PooledResource注入。

工厂基本上注入与HandlerInterceptor中使用的对象相同的对象,并创建(或只返回)PooledResource