我知道两个内容相同的请求使用不同的线程。我认为不同的线程将使用@Controller注释创建不同的实例。但是当我运行下面的代码时,我发现我的想法是错误的。
测试代码:
@Controller
@RequestMapping("test")
public class TestADEDSAController {
private String string = "";
@RequestMapping("controllerTest")
@ResponseBody()
public String controllerTest(@RequestParam String string) {
return this.string += string;
}
}
第一次响应内容如下:
test
第二次是这样的:
testtest
JVM中似乎只有一个Test实例。
我想知道JVM中是否总是只有一个@Controller实例?此外,我在哪里可以找到关于这个过程的详细介绍?
默认情况下,Spring中的所有bean都创建为singleton
(每个IOC容器一个(。
这是javadoc
(默认(将单个bean定义范围界定为每个Spring IoC容器的单个对象实例。
默认情况下,Spring创建一个bean的共享实例。bean作用域默认为singleton
。如果您需要在每个请求上创建一个新实例,那么应该将bean范围定义为prototype
。这可以通过用@Scope("prototype")
注释类来完成,也可以通过在spring配置xml中定义范围来完成,如下所示:
<bean id="controllerId" class="com.package.name.TestADEDSAController" scope="prototype"/>
请通过https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html以便在春季更好地了解bean范围。
否,默认情况下,对象是singleton。这意味着您的对象必须是线程安全的。因此,在控制器中使用不安全的值(例如字符串,常量除外(是一种糟糕的做法。
如果两个线程同时进入,您的字段可能已损坏。
默认作用域为"singleton",因此,如果每次需要Spring创建一个新实例,除了@Controller注释外,还可以使用@scope("prototype"(注释。还有其他web感知范围,如请求、会话和全局会话。阅读此处获取示例。