Spring MVC Controller單例陷阱

瓜瓜東西發表於2015-01-21

Spring MVC Controller預設是單例的:


單例的原因有二:

1、為了效能。

2、不需要多例。


1、這個不用廢話了,單例不用每次都new,當然快了。

2、不需要例項會讓很多人迷惑,因為spring mvc官方也沒明確說不可以多例。

  我這裡說不需要的原因是看開發者怎麼用了,如果你給controller中定義很多的屬性,那麼單例肯定會出現競爭訪問了。

  因此,只要controller中不定義屬性,那麼單例完全是安全的。下面給個例子說明下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.lavasoft.demo.web.controller.lsh.ch5;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * Created by Administrator on 14-4-9.
 *
 * @author leizhimin 14-4-9 上午10:55
 */
@Controller
@RequestMapping("/demo/lsh/ch5")
@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("testuname");
        user.setAge("23");
        model.put("user", user);
        return "/lsh/ch5/show";
    }
    @RequestMapping("/test")
    public String test() {
        System.out.println(st++ + " | " + index++);
        return "/lsh/ch5/test";
    }
}



0 | 0

1 | 1

2 | 2

3 | 3

4 | 4


改為單例的:

0 | 0

1 | 0

2 | 0

3 | 0

4 | 0


從此可見,單例是不安全的,會導致屬性重複使用。


最佳實踐:

1、不要在controller中定義成員變數。

2、萬一必須要定義一個非靜態成員變數時候,則通過註解@Scope("prototype"),將其設定為多例模式。



本文出自 “熔 巖” 部落格,請務必保留此出處http://lavasoft.blog.51cto.com/62575/1394669

相關文章