首先上測試代碼
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sun.accessibility.internal.resources.accessibility;
@Controller
@Scope("prototype")
public class MyController {
private int i = 0; //非靜態
private static int a=0;//靜態
@RequestMapping("/test1")
public String toShow(ModelMap model) {
System.out.println((++i)+"-----"+(++a));
return "hello";
}
}
當瀏覽器第一次訪問http://localhost:8080/boot-crm/test1.action
我們來看控制檯和debug輸出信息
注意debug顯示的當前controller的id
再次訪問
從debug提供的信息可以看出多例模式下的controller的id會變化,也就是說2次訪問action,springMVC創建了不同的controller.
當在controller類上去掉@scope(“prototype”),變成默認的單例模式
訪問action
再次訪問
2次訪問的是同一個controller,共享普通成員變量和靜態成員變量.
總結:
單例模式下會共享普通成員變量和靜態成員變量,多例模式下普通成員變量不共享,靜態成員共享.
在開發中,springMVC優先使用單例模式,而且儘量不要在controller中設定成員變量.
如果要定義成員變量併爲成員變量賦值可以配置source.properties,通過讀取配置文件爲成員變量初始化.