Spring在整合SpringMVC 時的Controller作用域默認是單例。
Spring在整合Strut2時Action是作用域原型。
我們知道Spring在配置bean時默認是單例。那麼對於的service和dao層的bean也是使用的單例模型。
我們做個測試
package com.pyc.test.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 創建時間:2015-2-1 下午9:40:03
*
* @author andy
* @version 2.2
*
*/
@Controller
@RequestMapping("/my")
public class TestController {
private static Integer num_s = 0;
private Integer num_n = 0;
@RequestMapping("/count")
public @ResponseBody
Integer show() {
System.out.println("num_s:" + (num_s++) + " num_n:" + (num_n++));
return 1;
}
}
多次請求之後:
可以看出變量num_n使用的同一個成員變量,所以說明默認是單例。
當我們添加如下代碼時,添加@Scope改變爲原型模式:
@Controller
@Scope("prototype")
@RequestMapping("/my")
可以看到非靜態成員變量始終是新的。
SpringMVC的Controller數據都是從方法參數傳入的,是方法級的,使用單例模式,所以在沒有共享成員變量情況下是線程安全的,應該避免共享的成員變量防止出現線程安全問題,
而Spring管理的Struts2的Action是原型模式,Action是類級別的,參數可以是成員變量,不存在線程安全問題。