2012-10-18 137 views
1

我在創建一個新bean時遇到了一個小問題。基本上按照請求,我得到一些參數,需要傳遞給一個bean。下面我爲每個請求實例化ControllerService。相反,我希望它是一個scope = protype的bean。這樣我就可以爲每個請求獲得一個新對象。 但是,那麼我如何設置我通過構造函數在bean中發送的2個屬性(kpiName,kpiInput)?Bean中的構造函數

@Autowired 
@Qualifier("serviceManager") 
Cleanser serviceManager; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody 
String getKPIResult(@RequestParam("kpiName") String kpiName, 
      @RequestParam("kpiInput") String kpiInput) {  

    return serviceManager.checkAndExecute(new ControllerService(kpiName, kpiInput)); 
} 

回答

1

在這種情況下,如果你違背了Spring的粒度,我會建議你也許以某種不被認爲是最佳實踐的方式做某件事。沒有更多的上下文,它很難看到。

Spring Social使用request作用域bean來實現特定用戶的存儲庫。我現在已經明白爲什麼這是一種非常低效的做事方式,恕我直言,恕我直言。

<bean id="connectionRepository" factory-method="createConnectionRepository" 
    factory-bean="usersConnectionRepository" scope="request"> 
    <constructor-arg 
     value="#{T(org.springframework.security.core.context.SecurityContextHolder).getContext().getAuthentication().getPrincipal()}" /> 
    <aop:scoped-proxy proxy-target-class="false" /> 
</bean> 

你可以在這裏看到使用factory-beanfactory-method聲明一個類/方法,希望您的類的實例時調用。構造函數參數使用SpEL傳遞。我不太清楚在Spring MVC中如何響應Web請求來實現這一點,但我相當肯定你可以使用Spring Integration來傳遞消息並使用SpEL來獲取消息傳遞給構造函數。

雖然我在這裏真的質疑你的設計模式 - 更常見的SOA習慣用法是在啓動時創建服務,並且從那裏開始使用它作爲無狀態,而不是創建具有特定狀態的實例爲每個請求。祝你好運!

1

不要。 Spring MVC中的控制器主要來自舊的Java servlet,根據規範它應該是無狀態的。實際上,控制器對象在處理程序映射框架內部是硬緩存的,而不是從每個請求的bean上下文中獲取。將範圍設置爲「原型」實際上什麼都不做,因爲處理程序(控制器)實際上只能獲得一次。