2017-02-20 102 views
1

範圍的bean我有資源的對象池:春 - 請求從對象池

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。

回答

2

執行HandlerInterceptor並將其注入請求範圍的bean。當調用preHandle時,使用正確的值設置bean。當調用afterCompletion時,再次清理它。

請注意,您需要將它與Bean Factory結合,才能在您的其他組件中獲得漂亮的PooledResource注入。

工廠基本上注入與HandlerInterceptor中使用的相同的對象,並創建(或僅返回)PooledResource

+0

謝謝你的建議。 'HandlerInterceptor'是否與JAX-RS/Jersey結合使用? –

+0

我對此不確定,如果不行,你可以降低級別並尋找可以安裝的請求/響應的某種過濾器。 – john16384