在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?
答案 0 :(得分:0)
这篇文章非常清楚地解释了两者的工作原理:Spring Request and Prototype Scope?
我想说,如果您的应用只使用简单的操作,那么您使用哪种操作并不重要。如果您正在使用过滤器或struts拦截器并且希望在请求管道中的不同步骤之间保持状态,那么您必须使用请求范围的bean。否则它再无关紧要。
如果基于请求的bean不是绝对必要的话,我可能会使用基于原型的bean。