带有@Controller注释的类是单个对象吗



我知道两个内容相同的请求使用不同的线程。我认为不同的线程将使用@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感知范围,如请求、会话和全局会话。阅读此处获取示例。

相关内容

最新更新