2013-12-16 51 views
1

我得到Object在REST web service controller's Web方法中進行本地初始化。在Spring MVC中使用工廠模式實例化bean 3

@RequestMapping(method = RequestMethod.POST,value = "/test",headers="Accept=*/*") 
    public @ResponseBody ModelAndView computeDetails(@RequestBody RequestObj reqObj, ModelMap model) { 

     System.out.println(reqObj.getcode()); 

     return new ModelAndView("responsedetails", "object", reqObj); 
    } 

此RequestObj對象擁有使用工廠實例化依賴項的密鑰code

已定義實現BaseCode接口的不同代碼類。

如何使用工廠方法來實例化特定的代碼類,這些代碼類是基於我的服務bean中BaseCode類型的代碼值進行實例化的?

有什麼想法?提前致謝。

回答

0

我就是這麼做的 -

讓你的工廠爲ServletContextAware的方式獲取currentContext。並定義getInstance方法爲

WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 

ctx.getBean(classNameToBeInstantiated); 

定義您的bean在Spring上下文中的繼承,以便Spring注入其依賴項。

0

我不確定我是否理解你的問題,但一般情況下,春天的依賴在這裏沒有任何關係。只需編寫自定義Factory類並根據reqObj.getcode()返回BaseCode實現。

+0

HI czajek,問題是這個reqObj沒有通過spring context來實例化它的本地方法。如何將此本地對象中的此密鑰傳遞給自定義工廠類。 – AmitN

1

我通常在這種情況下,做的是:

  1. 注入出廠到使用Spring的豆
  2. 創建的工廠方法getBaseCode(String code)控制器(請注意:String這裏代表代碼類型,所以使用實際的代碼類型如果沒有String
  3. 使getBaseCode而構建真正落實
  4. 蘇返回BaseCode接口pposing你有BaseCodeexecute方法,使用getBaseCode方法到控制器,以獲得真正的合作者,然後調用execute方法來執行實際的行動


忽略的第一點(我認爲你可以很容易看任何Spring教程)工廠將會像

public class BaseCodeFactory { 
    public BaseCode getBaseCode(String code) { 
    if(code.equals("something")) return new ThisBaseCodeImpl(); 
    else //and so on 
    } 
} 

computeDetails變成類似於:

@RequestMapping(method = RequestMethod.POST,value = "/test",headers="Accept=*/*") 
public @ResponseBody ModelAndView computeDetails(@RequestBody RequestObj reqObj, ModelMap model) { 
    //... 
    factory.getBaseCode(reqObj.getcode()).execute(); 
    //... 
} 

作爲一個方面說明,我不會選擇像我在這裏選擇的名稱,我建議你在你的域中尋找更有意義的東西(例如BaseCode沒有意義),請將此片段作爲指令。

根據OP評論。如果你有ThisBaseCodeImpl這使得使用其他的Spring bean可以

  1. @Configurable所以對它進行註釋,當你使用它的new ThisBaseCodeImpl(/*args if you like*/)豆是由Spring實例化。我個人不喜歡這個解決方案,因爲在我看來,它用隱藏的Spring bean來污染代碼。另一方面是非常靈活的,因爲它允許您管理運行時構造函數參數和Spring beans
  2. ThisBaseCodeImpl添加到Spring上下文並更改工廠,以便爲其注入ThisBaseCodeImpl的協作者。

1點例如:

@Configurable 
public class ThisBaseCodeImpl { 
    @Resource 
    private Bean bean; 
} 

第二點例如:

public class BaseCodeFactory { 
    @Resource 
    ThisBaseCodeImpl thisBaseCodeImpl; 

    public BaseCode getBaseCode(String code) { 
    if(code.equals("something")) return thisBaseCodeImpl; 
    else //and so on 
    } 
} 
+0

是這樣的,但在這種情況下,對於ThisBaseCodeImpl的依賴注入將不會被Spring處理。這是缺點。我確實設法使用WebApplicationContext getbean方法實例化bean。所以依賴關係由spring來管理。 – AmitN

+0

@AmitN,對不起,我不清楚你希望你的'BaseCode'實現有由Spring管理的依賴項。我會更新我的答案,爲您的案例提供其他兩種可能的解決方案。 – ThanksForAllTheFish

相關問題