2012-10-18 97 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上下文中获取。将范围设置为“原型”实际上什么都不做,因为处理程序(控制器)实际上只能获得一次。