Bean中的构造函数

时间:2012-10-18 10:30:00

标签: spring spring-mvc javabeans

创建新bean时遇到一个小问题。基本上根据请求,我得到一些参数,需要传递给bean。下面我为每个请求实例化ControllerService。相反,我希望它是一个scope = protype的bean。这样我就可以获得每个请求的新对象。 但是,我如何设置我通过bean中的构造函数发送的2个属性(kpiName,kpiInput)?

@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));
}

2 个答案:

答案 0 :(得分:1)

在这样的情况下,你要反对春天,我建议你可能会以一种不被认为是最佳实践的方式做某事。没有更多的背景,很难看到。

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 :(得分:1)

别。 Spring MVC中的Controller主要来自旧的Java servlet,它应该是规范的无状态。

实际上,Controller-objects在处理程序映射框架内是硬缓存的,而不是在每个请求中从bean上下文中获取。将范围设置为“原型”实际上无效,因为处理程序(控制器)实际上只获得一次。