zoukankan      html  css  js  c++  java
  • SpringMVC深入学习----单例or多例

    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"),将其设置为多例模式。

  • 相关阅读:
    冲不动刺。。
    第六次作业——团队作业
    LeetCode 638 Shopping Offers
    windows 64bit 服务器下安装32位oracle database 11g 问题集
    Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟
    Codeforces Round #381 (Div. 2) D. Alyona and a tree 树上二分+前缀和思想
    HDU 1171 Big Event in HDU 多重背包二进制优化
    HDU 3401 Trade dp+单调队列优化
    HDU 5976 Detachment 打表找规律
    HDU 5973 Game of Taking Stones 威佐夫博弈+大数
  • 原文地址:https://www.cnblogs.com/binbang/p/5354209.html
Copyright © 2011-2022 走看看