Spring MVC Controller默认是单例模式的。
因为:1、单例不需要实例化new,性能好
2、不需要多例,具体原因主要看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
@Controller @RequestMapping("/demo") @Scope("prototype") public class MultViewController { private static int st = 0; //静态的 private int index = 0; //非静态 @RequestMapping("/show") public String toShow(ModelMap model) { User user = new User(); user.setUserName("name"); user.setAge("123"); model.put("user", user); return "/show"; } @RequestMapping("/test") public String test() { System.out.println(st++ + " | " + index++); return "/test"; } }
单例结果: 0|0 1|1 2|2 3|3 原因:单例模式前提下,controller类的实例在应用存在环境中只有一个,多次请求访问下,访问到的都是同一对象,而作为对象实例的变量,对其进行操作会改变其结果,第一次请求访问返回的结果才是正确的。而多次访问的情况下,实例的变量反而变化了。 多例结果 0|0 1|0 2|0 3|0 原因:多例模式下,controller类的实例在应用存在环境中可能会有多个,每次请求访问到的都是不同实例,而作为实例的变量,各自的操作不会影响到其他的实例。但作为类变量,实例或许有多个,但类变量确实不会变得,其操作对象只有一个。 因此不管单例还是多例,类变量并不会因其不同而有所区别。
从此可见,单例是不安全的,会导致属性重复使用。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。