1. 程式人生 > >spring mvc 設定@Scope("prototype")

spring mvc 設定@Scope("prototype")

spring中bean的scope屬性,有如下5種類型:

  1. singleton 表示在spring容器中的單例,通過spring容器獲得該bean時總是返回唯一的例項
  2. prototype表示每次獲得bean都會生成一個新的物件
  3. request表示在一次http請求內有效(只適用於web應用)
  4. session表示在一個使用者會話內有效(只適用於web應用)
  5. 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"),將其設定為多例模式。