答案:

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。

相信大家不难发现 :

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

推荐一个DD写的SpringBoot基础教程:

http://blog.didispace.com/spring-boot-learning-2x/

解决方案

1、不要在controller中定义成员变量。2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。3、在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。

Controller 是单例还是多例?怎么保证并发的安全相关推荐

  1. SpringMVC Controller单例和多例

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

  2. SpringMVC中的Controller默认单例

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

  3. 设计模式C#描述——单例与多例模式

    设计模式C#描述--单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有以下特点: 单例类只能有一个实例. 单例 ...

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

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

  5. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  6. Spring中bean的单例与多例

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

  7. Java面向对象(接口、匿名内部类、object类、单例、多例)

    1.1接口(抽象类与接口,优先使用接口) 抽象方法和全局常量的集合,使用interface定义,使用implements继承 接口可以多继承(可以向上强制转换) 接口只能有public,一般不写常量 ...

  8. java中单例和多例

    你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例. 你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例. 数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象. 1. 什 ...

  9. 多目标柔性车间调度丨NSGA-II:以算例MK01为例

    车间调度系列文章: 1.车间调度的编码.解码,调度方案可视化的探讨 2.多目标优化:浅谈pareto寻优和非支配排序遗传算法-NSGAII的非支配排序及拥挤度 3.柔性车间调度问题:以算例MK01初探 ...

  10. Scala-Unit6-final/type关键字、样例类样例对象

    一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...

最新文章

  1. 复习计算机网络基础 day9--应用层
  2. python中封装、继承、多态
  3. [转]autoid文件上传
  4. 利用OpenCV实现图像拼接的代码
  5. python学习_22(文件)
  6. WORD中怎么把文字转换成表格
  7. The Genymotion virtual device could not obtain an IP address
  8. 详解java集合之LinkedList——底层实现是头尾、双向节点,尽情地问我有没有看过集合源码吧!
  9. 为什么构造函数不能是虚函数
  10. WEB Service 下实现大数据量的传输
  11. 多核Cache一致性 伪共享 atomic的实现和cache相关的部分
  12. visual svn server安装失败
  13. yii2 php7 mongodb,Yii2中MongoDB的使用方法-CURD
  14. Layui文件上传样式在ng-dialog不显示的问题处理
  15. 【优化布局】基于粒子群算法求解带出入点的车间布局优化问题附matlab代码
  16. ZOJ 3551 Bloodsucker 题解
  17. java发送带格式邮件及带多附件
  18. C语言基础第五次作业
  19. TortoiseGit提示No supported authentication methods available异常
  20. 给大家推荐几款简洁实用电脑软件!

热门文章

  1. 会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...
  2. 如何理解Memory leak
  3. go语言json的使用技巧
  4. stc51单片机怎么学, 先掌握STC单片机程序烧录方法
  5. vb科学计算机x y,vb程序用vb实现系统的计算器功能1/x,sqrt,%,+/-, 爱问知识人
  6. 第4关:非递归实现二叉树左右子树交换
  7. 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp
  8. Luogu P4178 Tree (点分治 + 树状数组)
  9. POJ2932Coneology(计算几何、平面扫描)
  10. 【每日DP】day6 P1541 乌龟棋(四维DP)难度⭐⭐⭐