我有一个资源对象池:
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
,但这似乎不支持回赠豆。
答案 0 :(得分:2)
实现HandlerInterceptor
并使用请求范围的bean注入它。调用preHandle
时,使用正确的值设置bean。调用afterCompletion
时,请再次清理它。
请注意,您需要将其与Bean Factory结合使用,以便在其他组件中获得良好的PooledResource
注入。
工厂基本上注入与HandlerInterceptor
中使用的对象相同的对象,并创建(或只返回)PooledResource
。