博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc控制器controller单例问题
阅读量:4041 次
发布时间:2019-05-24

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

springmvc controller默认的是单例singleton的,具体可以查看注解scope可以一目了然。

单例的原因有二:

1、为了性能。

2、不需要多例。

 

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

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

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

  因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:

@Controller@RequestMapping("/demo")public class MultViewController {    private static int st = 0;      //静态的    private int index = 0;          //非静态       @RequestMapping("/test")    public void test() {        System.out.println(st++ + " | " + index++);    }}

默认单例的,随着请求次数的增加:

0 | 0

1 | 1

2 | 2

3 | 3

4 | 4

...

controller增加注解:

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

此时,无论多少次请求,结果为:

0 | 0

1 | 0

2 | 0

3 | 0

4 | 0

...

从以上很容易看出,单例是线程不安全的,会导致属性的重复性利用。

 

最佳实践:

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

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

 

转载自 

你可能感兴趣的文章
1079. Total Sales of Supply Chain (25)
查看>>
1025. PAT Ranking (25)
查看>>
1048. Find Coins (25)
查看>>
1049. Counting Ones (30)计算个位数出现次数.
查看>>
1059. Prime Factors (25)
查看>>
1089. Insert or Merge (25)
查看>>
1068. Find More Coins (30)
查看>>
相邻两数最大差值练习题
查看>>
拓扑结构相同子树练习题
查看>>
字符串空格替换练习题
查看>>
最长无重复字符子串练习题
查看>>
获取栈中最小值函数,时间复杂度为O(1)
查看>>
两个栈实现一个队列
查看>>
栈的反转
查看>>
栈的排序,栈顶元素最大.
查看>>
next数组计算.
查看>>
队列的滑动窗口最大值练习题.
查看>>
数组变树练习题
查看>>
打印两个链表的公共值练习题
查看>>
链表逆序问题
查看>>