Spring MVC应用程序是否可以多线程,即使它的servlet不是?

时间:2011-05-12 15:14:06

标签: java multithreading spring servlets spring-mvc

当你谈到一个多线程的Spring应用程序时,你是否一定是指那个应用程序中定义的servlet是否是多线程的?

即使应用程序中的servlet不是多线程的,也可以将Spring应用程序配置为多线程?

4 个答案:

答案 0 :(得分:7)

不再支持单线程servlet。它们已被弃用了很长时间,因此所有servlet都是多线程的。

然后,spring不使用servlet(除了一个 - 调度程序)。它使用bean,可以是控制器,服务和存储库(daos)。

这些bean是线程安全的(我认为你的意思是“多线程”),如果他们的字段中没有任何数据(除了它们的依赖项)

简而言之 - 不要在spring bean中存储任何数据。将所有必需的数据作为参数传递。

答案 1 :(得分:4)

典型的Java Web应用程序是多线程的,因为每个请求都在自己的线程上处理。在这样的应用程序中,当你拥有维护状态的对象时(例如通过修改静态属性),你必须要小心,因为它们可以相互覆盖。

当您谈论servlet时,如果两个请求同时进入同一个servlet,则相关的servlet代码将同时执行两次。在像Struts或Spring那样委托对象的框架中,可以重用相同的bean实例,也可以为每个请求创建一个新的bean实例,具体取决于你如何配置框架(即使用原型或单例)春天的情况)

答案 2 :(得分:3)

Spring MVC使用单个调度servlet来调用已定义的Controller。话虽这么说,控制器应该是无状态的弹簧注入豆的排除。通过一个操作更改一个控制器的状态可以影响另一个操作。

答案 3 :(得分:3)

如果我正确理解你的问题,servlets(或java bean)本身不需要担心多线程。要创建多个线程,可以通过在步骤配置中执行以下操作来实例化多线程步骤或并行步骤:

多线程步骤:

<step id="loading"> <tasklet
task-executor="taskExecutor"
throttle-limit="20">...</tasklet>
</step>

平行步骤:

<job id="job1">
<split id="split1" task-executor="taskExecutor" next="step4">
    <flow>
        <step id="step1" parent="s1" next="step2"/>
        <step id="step2" parent="s2"/>
    </flow>
    <flow>
        <step id="step3" parent="s3"/>
    </flow>
</split>
<step id="step4" parent="s4"/>

可以更深入地here找到并评论这些示例。