首先上測試代碼
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,通過讀取配置文件為成員變量初始化.
原文:https://blog.csdn.net/weiha666/article/details/78670644