答案是单例,为了验证这一点举一个简单的例子。

package com.example.yxjc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    private int count;

    @ResponseBody
    @GetMapping("/home")
    public String welcome(){
        count = count +1;
        return "hello: " + count;
    }
}

演示效果

SpringMVC中Controller单例演示

如果是单例的那么会存在线程安全的问题,可以通过以下几种方法解决

1. 尽量不要在controller中使用变量。

2. 如果非要使用请使用ThreadLocal,为每个线程创建一个变量的副本。

3. 使用@Scope("prototype")注解将controller变为多例模式。

显然第3种不太合适高并发的情况,如果非要使用变量请使用ThreadLocal类修饰。