Spring的Controller是单例还是多例?怎么保证并发的安全
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试文章
作者:riemann_
blog.csdn.net/riemann_/article/details/97698560
答案:
controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。
我们下面来简单的验证下:
package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author riemann* @date 2019/07/29 22:56*/
@Controller
public class ScopeTestController {private int num = 0;@RequestMapping("/testScope")public void testScope() {System.out.println(++num);}@RequestMapping("/testScope2")public void testScope2() {System.out.println(++num);}}
我们首先访问 http://localhost:8080/testScope,得到的答案是1;
然后我们再访问 http://localhost:8080/testScope2,得到的答案是 2。
得到的不同的值,这是线程不安全的。
接下来我们再来给controller增加作用多例 @Scope("prototype")
package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author riemann* @date 2019/07/29 22:56*/
@Controller
@Scope("prototype")
public class ScopeTestController {private int num = 0;@RequestMapping("/testScope")public void testScope() {System.out.println(++num);}@RequestMapping("/testScope2")public void testScope2() {System.out.println(++num);}}
我们依旧首先访问 http://localhost:8080/testScope,得到的答案是1;
然后我们再访问 http://localhost:8080/testScope2,得到的答案还是 1。
相信大家不难发现 :
单例是不安全的,会导致属性重复使用。
解决方案
不要在controller中定义成员变量。
万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。
在Controller中使用ThreadLocal变量
补充说明
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。
热门内容:你说,一个Java字符串到底有多少个字符?
在Java项目中打印错误日志的正确姿势,排查问题更方便,非常实用!一款vue编写的功能强大的swagger-ui,有点秀(附开源地址)BeanUtils 是用 Spring 的还是 Apache 的好?因用了Insert into select语句,美女同事被开除了!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
Spring的Controller是单例还是多例?怎么保证并发的安全相关推荐
- Spring 的 Controller 是单例还是多例?怎么保证并发的安全
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | riemann_ 来源 | blog.csdn ...
- SpringMVC中的Controller默认单例
众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...
- Spring(07)——单例注入多例之lookup-method
2019独角兽企业重金招聘Python工程师标准>>> Spring(07)--单例注入多例之lookup-method 博客分类: spring 7 单例注入多例之lookup-m ...
- SpringMVC Controller单例和多例
对于SpringMVC Controller单例和多例,下面举了个例子说明下. 第一次:类是多例,一个普通属性和一个静态属性. 结果:普通属性:0.............静态属性:0 普通属性:0. ...
- Spring 框架中的单例Beans 是线程安全的么?
Spring 框架并没有对单例bean 进行任何多线程的封装处理.关于单例bean 的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean 并没有可变的状态(比如Servi ...
- spring框架中的单例Beans是线程安全的么?
看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...
- Spring框架中的单例Beans是线程安全的么
看到这样一个问题:Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...
- Spring中bean的单例与多例
Spring中bean的单例与多例 前言 Spring中单例与多例 如何配置单例/多例 单例/多例Bean的使用事项 总结 前言 之前其实已经学习过对于单例模式的使用单例模式讲解,也用过一段时间的Sp ...
- 结合Spring源码学习单例设计模式
之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...
最新文章
- UVa 11021 (概率 递推) Tribles
- SharePoint 检测页面编辑模式
- oracle scott用户
- poj 1338 优先队列
- MapReduce基础开发之六Map多输入
- ARM学习书单一提供打包下载地址
- Spark SQL and DataFrame for Spark 1.3
- java原生的ajax怎么写_原生Ajax代码实现
- Java 三个线程依次输出ABC
- 低学历、文科出身,我如何从月薪不到 3000 逆袭为大厂高薪程序员?
- 对话彭军、楼教主:1.12亿美元融资来了,Pony.ai车队也已在路上 | 变局者
- mysql5.7下载与安装(windows10)
- CAS单点登陆,URL多出个参数jsessionid导致登陆失败问题
- java特征提取_特征提取
- 获取服务器的wsdl文件,vb.net根据wsdl文件生成WebService服务器端代码
- JVM 字节码 栈图(Stack Map Table) 学习笔记
- 高一计算机会考英语作文,高一考试英语作文常考题目及范文
- hdoj4826Labyrinth【dp】
- 专访网秦创始人林宇:我曾每天戴20公斤手铐 生不如死
- 驱动谷歌浏览器执行用例时报错java.lang.IllegalStateException
热门文章
- ORA-01747: user.table.column, table.column 或列说明无效 异常解决方法总结
- Android Java使用JavaMail API发送和接收邮件的代码示例
- 凌亮:动手学数据分析笔记
- 软件开发过程中遇到的问题
- 无人驾驶矿山赛道单笔最大融资:踏歌智行完成2亿元B轮融资
- FastSpeech语音合成系统技术升级,微软联合浙大提出FastSpeech2
- 2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
- 读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势
- 刷新中文阅读理解水平,哈工大讯飞联合发布基于全词覆盖中文BERT预训练模型...
- IEEE“撑不住”了?声明解除对华为评审限制