Spring管理的Struts 2 Action类的适当范围应该是什么?

时间:2017-10-07 14:09:18

标签: java spring struts2 thread-safety global-variables

在Spring托管的Struts 2应用程序中, HttpServletRequest 对象在Action类中存储为全局变量。 在做了一些研究之后,我发现默认情况下Struts Action类是线程安全的,因为它们是为每个请求实例化的,但是在上面描述的场景中,Struts Action类被配置为Spring bean而没有提到bean范围(所以默认情况下它们是单身)。我认为这是灾难的一个方法,所以我正在寻找修复,我在下面的官方Struts 2 Spring集成示例中找到了以下内容:

<bean id="editService" class="org.apache.struts.edit.service.EditServiceInMemory"/>

<bean id="editAction" class="org.apache.struts.edit.action.EditAction" scope="prototype">

    <property name="editService" ref="editService" />

</bean>

这里将范围设置为原型,但事实上它应该是请求,因为动作类需要为每个Http请求实例化。请告诉我我的理解是否正确以及它是否是正确的解决方案,而不是将请求对象实例化为局部变量。

我在堆栈溢出中发现了以下问题,但我想知道Struts 2: Spring Request and Prototype Scope?

1 个答案:

答案 0 :(得分:0)

这篇文章非常清楚地解释了两者的工作原理:Spring Request and Prototype Scope?

我想说,如果您的应用只使用简单的操作,那么您使用哪种操作并不重要。如果您正在使用过滤器或struts拦截器并且希望在请求管道中的不同步骤之间保持状态,那么您必须使用请求范围的bean。否则它再无关紧要。

如果基于请求的bean不是绝对必要的话,我可能会使用基于原型的bean。