博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC Controller单例陷阱
阅读量:6963 次
发布时间:2019-06-27

本文共 1390 字,大约阅读时间需要 4 分钟。

Spring MVC Controller默认是单例的:

单例的原因有二:

1、为了性能。

2、不需要多例。

1、这个不用废话了,单例不用每次都new,当然快了。

2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。

  我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。

  因此,只要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(
"/show"
)
    
public 
String 
toShow(ModelMap model) {
        
User user = 
new 
User();
        
user.setUserName(
"testuname"
);
        
user.setAge(
"23"
);
        
model.put(
"user"
, user);
        
return 
"/lsh/ch5/show"
;
    
}
    
@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

从此可见,单例是不安全的,会导致属性重复使用。

最佳实践:

1、不要在controller中定义成员变量。

2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/1394669,如需转载请自行联系原作者

你可能感兴趣的文章
cocos2d-x 异步加载plist,png等文件
查看>>
tolua 类的使用
查看>>
JAVA语言运算符
查看>>
五种方法解决Magento中jQuery和Prototype兼容性
查看>>
再调用函数时需要对函数进行声明
查看>>
PPT模板网站
查看>>
InSave 隐私政策
查看>>
[Linux command]批处理注释
查看>>
jquery 选择器
查看>>
虚基类的简单应用
查看>>
1.4变量和数据类型进阶
查看>>
数据块对齐
查看>>
Http 请求方式:Get 与Post
查看>>
delphi 操作文件时间的函数
查看>>
nodjs 生产环境及升级问题
查看>>
JS判断客户端是否是iOS或者Android手机移动端
查看>>
Swing控件
查看>>
快速JavaEE轻量级框架&公用业务模块 设计&实现 6.1 - DAO测试
查看>>
文本特征提取算法实现
查看>>
这个qq的域名【c.gj.qq.com】是做什么的?chrome浏览器,访问什么网站都有这个请求...
查看>>