点击上方“方志朋”,选择“设为星标”

回复”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是单例还是多例?怎么保证并发的安全相关推荐

  1. Spring 的 Controller 是单例还是多例?怎么保证并发的安全

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | riemann_ 来源 | blog.csdn ...

  2. SpringMVC中的Controller默认单例

    众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...

  3. Spring(07)——单例注入多例之lookup-method

    2019独角兽企业重金招聘Python工程师标准>>> Spring(07)--单例注入多例之lookup-method 博客分类: spring 7 单例注入多例之lookup-m ...

  4. SpringMVC Controller单例和多例

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

  5. Spring 框架中的单例Beans 是线程安全的么?

    Spring 框架并没有对单例bean 进行任何多线程的封装处理.关于单例bean 的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean 并没有可变的状态(比如Servi ...

  6. spring框架中的单例Beans是线程安全的么?

    看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  7. Spring框架中的单例Beans是线程安全的么

    看到这样一个问题:Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  8. Spring中bean的单例与多例

    Spring中bean的单例与多例 前言 Spring中单例与多例 如何配置单例/多例 单例/多例Bean的使用事项 总结 前言 之前其实已经学习过对于单例模式的使用单例模式讲解,也用过一段时间的Sp ...

  9. 结合Spring源码学习单例设计模式

    之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...

最新文章

  1. UVa 11021 (概率 递推) Tribles
  2. SharePoint 检测页面编辑模式
  3. oracle scott用户
  4. poj 1338 优先队列
  5. MapReduce基础开发之六Map多输入
  6. ARM学习书单一提供打包下载地址
  7. Spark SQL and DataFrame for Spark 1.3
  8. java原生的ajax怎么写_原生Ajax代码实现
  9. Java 三个线程依次输出ABC
  10. 低学历、文科出身,我如何从月薪不到 3000 逆袭为大厂高薪程序员?
  11. 对话彭军、楼教主:1.12亿美元融资来了,Pony.ai车队也已在路上 | 变局者
  12. mysql5.7下载与安装(windows10)
  13. CAS单点登陆,URL多出个参数jsessionid导致登陆失败问题
  14. java特征提取_特征提取
  15. 获取服务器的wsdl文件,vb.net根据wsdl文件生成WebService服务器端代码
  16. JVM 字节码 栈图(Stack Map Table) 学习笔记
  17. 高一计算机会考英语作文,高一考试英语作文常考题目及范文
  18. hdoj4826Labyrinth【dp】
  19. 专访网秦创始人林宇:我曾每天戴20公斤手铐 生不如死
  20. 驱动谷歌浏览器执行用例时报错java.lang.IllegalStateException

热门文章

  1. ORA-01747: user.table.column, table.column 或列说明无效 异常解决方法总结
  2. Android Java使用JavaMail API发送和接收邮件的代码示例
  3. 凌亮:动手学数据分析笔记
  4. 软件开发过程中遇到的问题
  5. 无人驾驶矿山赛道单笔最大融资:踏歌智行完成2亿元B轮融资
  6. FastSpeech语音合成系统技术升级,微软联合浙大提出FastSpeech2
  7. 2097352GB地图数据,AI技术酷炫渲染,《微软飞行模拟器》游戏即将上线
  8. 读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势
  9. 刷新中文阅读理解水平,哈工大讯飞联合发布基于全词覆盖中文BERT预训练模型...
  10. IEEE“撑不住”了?声明解除对华为评审限制