首先上测试代码
import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import com.sun.accessibility.internal.resources.accessibility; @Controller @Scope("prototype") public class MyController { private int i = 0; //非静态 private static int a=0;//静态 @RequestMapping("/test1") public String toShow(ModelMap model) { System.out.println((++i)+"-----"+(++a)); return "hello"; } }
当浏览器第一次访问http://localhost:8080/boot-crm/test1.action
我们来看控制台和debug输出信息
注意debug显示的当前controller的id
再次访问
从debug提供的信息可以看出多例模式下的controller的id会变化,也就是说2次访问action,springMVC创建了不同的controller.
当在controller类上去掉@scope(“prototype”),变成默认的单例模式
访问action
再次访问
2次访问的是同一个controller,共享普通成员变量和静态成员变量.
总结:
单例模式下会共享普通成员变量和静态成员变量,多例模式下普通成员变量不共享,静态成员共享.
在开发中,springMVC优先使用单例模式,而且尽量不要在controller中设定成员变量.
如果要定义成员变量并为成员变量赋值可以配置source.properties,通过读取配置文件为成员变量初始化.
原文:https://blog.csdn.net/weiha666/article/details/78670644