Spring的Controller是怎么保证并发的安全
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,Spring的Controller是怎么保证并发的安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Controller 默认是单例
千家信息网最后更新 2025年12月01日Spring的Controller是怎么保证并发的安全
Spring的Controller是怎么保证并发的安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Controller 默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。
我们下面来简单的验证下:
package com.xttblog.springbootdemo.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 业余草,公众号
*/
@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.xttblog.springbootdemo.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 业余草,公众号
*/
@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。
关于Spring的Controller是怎么保证并发的安全问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
安全
变量
答案
作用
实例
成员
模式
问题
保证
不同
接下来
公众
就是
新产
时候
更多
线程
静态
帮助
管理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
域名绑境外服务器
学软件开发要学历吗
网络安全开展应急预案演练
软件开发项目运营模式
华夏数据库管理工具本地版
数据库清除表内容语句
手机强制清楚数据库
网络技术教育是什么
南山区新一代网络技术开发商家
小刀网络技术有限公司
昆山正规软件开发口碑推荐
多进程 数据库
如何备份服务器整个系统及文件
数据库临时表在哪看
数据库开发的主要技术
投资软件开发赔了
软件开发pgm是什么的缩写
音乐网站数据库设计
珠海地产软件开发费用是多少
移动网络技术的发展
我想自己找一个服务器
更改数据库的某个字段值
公司与产品的数据库建设
医院计算机信息网络安全管理制度
思讯后台服务器怎么连网
教育软件开发龙头
如何备份服务器整个系统及文件
无锡制造网络技术特点
网络安全法 数据安全
清理墨香数据库