springmvc中的controller是單例的

 

 咱們知道Spring MVC是多線程單實例的MVC框架,就是說,對於同一個Controller,只會生成一個實例來處理全部的請求,所以bean實例只會實例化一次,並被存放在工廠中,以供其餘請求使用web

今天發現spring3中的controller默認是單例的,如果某個controller中有一個私有的變量a,全部請求到同一個controller時,使用的a變量是共用的,即如果某個請求中修改了這個變量a,則,在別的請求中可以讀到這個修改的內容。
如果在@controller以前增長@Scope("prototype"),就能夠改變單例模式爲多例模式
 
 

單例的緣由有二:spring

一、爲了性能。安全

二、不須要多例。多線程

 

一、這個不用廢話了,單例不用每次都new,固然快了。mvc

二、不須要實例會讓不少人迷惑,由於spring mvc官方也沒明確說不能夠多例。app

  我這裏說不須要的緣由是看開發者怎麼用了,若是你給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 | 0ui

1 | 1spa

2 | 2

3 | 3

4 | 4

 

改成單例的:

0 | 0

1 | 0

2 | 0

3 | 0

4 | 0

 

今後可見,單例是不安全的,會致使屬性重複使用。

 

最佳實踐:

一、不要在controller中定義成員變量。

二、萬一必需要定義一個非靜態成員變量時候,則經過註解@Scope("prototype"),將其設置爲多例模式

相關文章
相關標籤/搜索