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
.
我有一个对象资源池:
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
.