spring mvc 設定@Scope("prototype")
阿新 • • 發佈:2019-02-13
spring中bean的scope屬性,有如下5種類型:
- singleton 表示在spring容器中的單例,通過spring容器獲得該bean時總是返回唯一的例項
- prototype表示每次獲得bean都會生成一個新的物件
- request表示在一次http請求內有效(只適用於web應用)
- session表示在一個使用者會話內有效(只適用於web應用)
- globalSession表示在全域性會話內有效(只適用於web應用)
在多數情況,我們只會使用singleton和prototype兩種scope,如果在spring配置檔案內未指定scope屬性,預設為singleton。
單例的原因有二:1、為了效能。
2、不需要多例。
1、單例不用每次都new,當然快了。
2、不需要例項會讓很多人迷惑,因為spring mvc官方也沒明確說不可以多例。
我這裡說不需要的原因是看開發者怎麼用了,如果你給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( "/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
最佳實踐:定義一個非靜態成員變數時候,則通過註解@Scope("prototype"),將其設定為多例模式。