我正在开发4.1版本的应用程序。我知道Spring中的Controllers /任何其他bean都不是线程安全的。即:单身人士。这意味着Controller的相同实例将用于处理多个并发请求。到此为止我很清楚。我想确认我是否需要在Controller类中显式设置@Scope("prototype")
或request
?我在StackOverflow上一篇文章中读到,即使scope未设置为request / prototype,Spring容器也能够根据传递的@RequestParam
或与方法争论相关的@ModelAttribute
单独处理每个请求。
所以我想确认下面的代码是否可以安全地同时处理多个请求?
@Controller
public class LogonController {
/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());
@Autowired
SimpleProductManager productManager;
@Autowired
LoginValidator validator;
@RequestMapping( "logon")
public String renderForm(@ModelAttribute("employee") Logon employeeVO)
{
return "logon";
}
@RequestMapping(value="Welcome", method = RequestMethod.POST)
public ModelAndView submitForm(@ModelAttribute("employee") Logon employeeVO,
BindingResult result)
{
//Check validation errors
validator.validate(employeeVO, result);
if (result.hasErrors()) {
return new ModelAndView("logon");
}
if(!productManager.chkUserValidation(employeeVO.getUsername(), employeeVO.getPassword())){
return new ModelAndView("logon");
}
ModelAndView model = new ModelAndView("Welcome");
return model ;
}
}
我还有另一个疑问。
因为我正在使用SimpleProductManager productManager;
我是否需要在scope="prototype
的bean声明中指定app-servlet.xml
?
以下是我的configuration.xml
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<bean id="productManager" class="com.BlueClouds.service.SimpleProductManager" >
<property name="productDao" ref="productDao"/>
</bean>
<bean id="productDao" class="com.BlueClouds.dao.HbmProductDao">
<property name="sessionFactory"><ref bean="mySessionFactory"/></property>
</bean>
<bean id="loginValidator" class="com.BlueClouds.service.LoginValidator" >
</bean>
在所有请求中共享单独的验证器实例,为此我需要在bean配置xml中添加scope=request
或者我需要在同步块中包围validate()
吗?请指教。
非常感谢。
答案 0 :(得分:1)
通过回答以下问题,您可以告诉您的代码是否是线程安全的
是否有线程可能同时修改一个非线程安全的静态字段(例如:arrayList)?
是否有线程可能同时修改一个不是线程安全的实例的字段?
如果上述任何答案都是肯定的,那么您的代码就不是线程安全的。
由于您的代码不会更改任何字段,因此它应该是线程安全的。
关于线程安全的一般想法是,如果有线程可能同时更改/访问同一个内存部分,那么它不是线程安全的,这意味着&#34; synchronized&#34;需要。
您最好在JAVA中了解有关堆栈内存,堆内存和全局内存的更多信息。这样您就可以理解您的代码是否在同一时间内更改了相同的内存部分。