文档章节

spring的controller默认是单例还是多例

莫库什勒
 莫库什勒
发布于 2017/02/15 19:47
字数 711
阅读 178
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

曾经面试的时候有面试官问我spring的controller是单例还是多例,结果我傻逼的回答当然是多例,要不然controller类中的非静态变量如何保证是线程安全的,这样想起似乎是对的,但是不知道(主要是我没看过spring的源码,不知道真正的内在意图)为什么spring的controller是单例的。

先看看spring的bean作用域有几种,分别有啥不同。

spring bean作用域有以下5个

singleton:单例模式, 当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;

prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;

====下面是在web项目下才用到的===

request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听

session:每次会话,同上

global session:全局的web域,类似于servlet中的application

好了,上面都说了spring的controller默认是单例,那很自然就是singleton了。

再看一个例子,看看单例会不会有我说的那种问题(就是类中定义的非静态变量线程安全问题),当然下面这个例子我是实验过的, 要不然也不敢发出来

为什么spring要默认是单例呢?原因有二:

1、为了性能。

2、不需要多例。

原因

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

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

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

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

 

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")

public class MultViewController {

    

    privateintindex = 0;         //非静态

    @RequestMapping("/show")

    publicStringtoShow(ModelMap model) {

        System.out.println(++i);

        return"/lsh/ch5/show";

    }

    @RequestMapping("/test")

    publicStringtest() {

        System.out.println(++i);

        return"/lsh/ch5/test";

    }

}

默认单例的

1 | 2

改为多例的(就是在class上面加一个@Scope("request")):

1 | 1

 

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

 

最佳实践:

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

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

莫库什勒

莫库什勒

粉丝 23
博文 215
码字总数 89822
作品 0
杭州
高级程序员
私信 提问
加载中
请先登录后再评论。
spring的controller默认是单例还是多例

转: spring的controller默认是单例还是多例 先看看spring的bean作用域有几种,分别有啥不同。 spring bean作用域有以下5个: singleton:单例模式,当spring创建applicationContext容器的时候...

osc_f15kijhe
2019/02/18
5
0
spring的controller默认是单例还是多例

先看看spring的bean作用域有几种,分别有啥不同。 spring bean作用域有以下5个: singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上...

osc_2xb14pj9
2019/09/03
17
0
SpringMVC Controller单例和多例

对于SpringMVC Controller单例和多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性和一个静态属性。 结果:普通属性:0.............静态属性:0 普通属性:0.............静态属...

osc_i06got93
2018/05/04
2
0
SpringMVC Controller单例和多例

对于SpringMVC Controller单例和多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性和一个静态属性。 结果:普通属性:0.............静态属性:0 普通属性:0.............静态属...

wangwei2134
2018/04/13
0
0
拦截器和过滤器区别,Struts2与SpringMVC的区别

拦截器和过滤器 拦截器是基于java反射机制的,而过滤器是基于函数回调的; 拦截器不依赖于servlet容器,而过滤器依赖于servlet容器; 拦截器只能对Action请求起作用,而过滤器则可以对几乎所...

Jason909
2019/05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

还在用Swagger(丝袜哥)生成接口文档?我推荐你试试它.....

JApiDocs是一个无需额外注解、开箱即用的SpringBoot接口文档生成工具。 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但除非项目前后...

路人甲Java
07/09
7
0
智能仓储的独角兽逻辑

智能仓储的主要应用市场在哪里?客户的付费意愿和付费能力如何? 1、仓储设备具备标准化和通用化特点 由于电商和新零售的快速发展,轻工业品零售仓库的需求量大幅增加。而中国又是全球轻工业...

logiter
2019/08/23
14
0
可是小腿哪能扭过大腿

父亲是一个特别勤苦的人,他从不睡懒觉,每天天麻麻亮,或是下地干活,或是在家搞副业,或是拿着铁锨、粪筐,到路边,到村子周围,到牲畜常出入的地方,去拾粪蛋子,为庄稼积攒肥料,父亲不仅...

瑾123
40分钟前
16
0
一个volatile跟面试官扯了半个小时

《安琪拉与面试官二三事》系列文章,本文是此系列第三篇 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 欢迎关注Wx公众号:【安琪拉的博客】—揭秘Java后端技术,...

osc_6ls9vwji
41分钟前
0
0
内网渗透靶机-VulnStack 2

WEB服务器:windows2008系统 外网网卡IP:192.168.1.152 内网网卡IP:10.10.10.80 域成员:windows server 2003系统 网卡IP:10.10.10.200 域控服务器:windows server 2008系统 网卡IP:192...

dnsil
07/10
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部