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

【SpringBoot系列】Springboot 重点知识点最强整理 目录 1、springboot controller 单例 2、Springboot 环境变量配置 3、restful 接口 4、@ResponseBody 和 @RequestBody 的区别 5、@Schedule 6、async异步调用 7、request 的获取方式和线程安全 1、springboot controller 单例 Spring中 controller默认是单例的,因为单例所以不是线程安全的。 所以需要注意下面几点 不要在Controller中定义成员变量,可 阅读详情

首先明确:Spring的controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。

其次要明白:因为是单例模式,所以是非线程安全的。

下面用简单代码示例下:

package com.riemann.springbootdemo.controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@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;

@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变成多例模式了,是线程安全的。

解决方案:

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

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

3、在Controller中使用ThreadLocal变量。

补充说明:

spring bean作用域有以下5个:

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

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

(下面是在web项目下才用到的)

request:每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听;

session: 每次会话,同request;

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

探究Spring中的Controller:单例、多例及其并发安全性 Spring框架作为Java生态系统中的重要一员,极大地方便了Java企业级应用的开发。其中,Spring MVC(Model-View-Controller)是Spring框架中的核心模块之一,主要用于构建Web应用程序。在Spring MVC中,`Controller`是处理用户请求的关键组件。那么,Spring中的Controller到底是单例(singleton)还是多例(prototype)?在单例模式下,如何保证并发的安全性?本文将从以下几个方面深入探讨这些问题。 阅读详情

相关推荐

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解 1.1 在RAM中运行还是在flash中运行指的是什么? 1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储 1.1.2 情况1:B函数是配置为在RAM中运行,

weixin_43776284的博客 8071

Spring的Controller是单例模式精讲

引言 很多同学都知道spring里默认bean模式是单例模式,但大多数人没有深刻理解这种模式的代表了什么,以及在开发是这种模式需要注意的点。希望通过几个测试的结果帮助大家理解单例模式的spring有哪些效果 知识点 先说下结论 Spring默认bean的模式是单例模式,@Controller也是bean的一种,也是单例模式。 单利模式下只在容器启动时创建一个实例,每次调用都共享这一个实例。pro...

kouryoushine的博客 1994

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

孟孟单单的博客 7万+

Spring的Controller是单例模式

Spring的Controller是单例模式

weixin_47792333的博客 1032

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 327

无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现

CMUCERLAB无人机自主框架是一个模块化的无人机自主导航系统,包含感知、测绘、规划和控制等组件。安装过程中遇到的主要问题包括:(1)cv_bridge路径未正确识别,需手动指定路径;(2)OpenCV版本冲突(4.2与4.6),导致动态导航节点崩溃。解决方案包括:完全卸载OpenCV4.2,重新编译安装OpenCV4.6,并修改相关CMakeLists文件指定版本。最终成功运行仿真环境,实现无人机在Gazebo和RViz中的自主避障导航功能。

weixin_45390670的博客 1648

(学习笔记)关于SpringMVC中的Controller、Service、DAO的多线程问题

SpringMVC中Controller为什么能够处理并发访问? SpringMVC中用来处理http请求的Controller是基于Servlet实现的,Spring中绝大多数的类都是单例的,Servlet也是这样。 Controller、Service、DAO都是默认单例模式 既然Controller是单例模式,那么它是怎么能够在同时处理很多个请求的呢? 想要搞明白这点,首先面临的一个问题是:计算机是如何处理一个请求的呢? 计算机大部分的任务都是由CPU来完成的,Controller虽然叫做控制器,但是

qq_43475336的博客 4188

Uncertainty-Aware Mean Teacher(UA-MT)

本文提出了一种新的基于不确定性的半监督学习框架(UA-MT),通过额外利用未标记的数据从3D MR图像中分割左心房。具体地说,本文建立了一个教师模型和一个学生模型,学生模型通过最小化标注数据上的分割监督损失和所有输入数据上的与教师模型预测输出的一致性损失进行优化。如果没有未标记输入中的注释,教师模型的预测目标可能不可靠且有噪声。:在估计不确定性 U 的指导下,我们过滤掉相对不可靠**(高不确定性),整个体积** U 的不确定性**是 {u} ∈ RH×W ×D。过滤掉高不确定性的,也就是熵大于某个值的。

Alexa_的博客 1870

spring的controller是单例还是多例,怎么保证并发的安全。

答案: controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。 正因为单例所以不是线程安全的。 我们下面来简单的验证下: package com.riemann.springbootdemo.controller; import org.springframework.context.annotation.Scope; import org.springframew...

riemann_的博客 2万+

Python调用CANoe

我们可以创建CANoe应用程序对象,打开配置文件,启动模拟,发送和接收消息,并在完成后关闭CANoe应用程序。这使得我们能够使用Python自动化执行测试任务,并集成CANoe的功能到我们的Python应用程序中。CANoe是一款功能强大的汽车网络仿真和测试工具,它能够模拟和分析汽车网络通信,并提供丰富的测试功能。通过Python编程语言,我们可以方便地调用CANoe的API,实现自动化测试和集成CANoe的功能到我们的Python应用程序中。在CANoe中,我们可以为不同的汽车网络创建配置文件。

AzqLinux的博客 1288

C++性能优化:深入理解缓存一致性与伪共享

在现代多核处理器的世界里,理解缓存一致性和伪共享就像理解一个复杂社会系统的运作规则。正如心理学家阿德勒所说:"人的行为总是有目的的",CPU缓存的每一次同步也都有其深层的硬件逻辑。本文将带你深入探索这些看不见的性能杀手,以及如何在实际项目中与它们优雅共处。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 936

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

Spring 的 Controller 是单例还是多例?怎么保证并发的安全 文章目录答案 答案 controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。 ...

wh柒八九的博客 343

ican项目四汽车零件智能测量

ican项目四汽车零件智能测量

weixin_72050316的博客 562

Spring的Controller是单例还是多例,如何保证并发的安全?

Controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。** 正因为单例所以不是线程安全的。 如下代码: package com.riemann.springbootdemo.controller; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.an

Venus's Blog 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

140面试必问:Spring的Controller是单例还是多例,怎么保证并发的安全

更多面试题:面试题内容聚合 controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。 我们下面来简单的验证下: packagecom.riemann.springbootdemo.controller; importorg.springframework.context.annotation.Scope; importorg.springframework.stereotype.Controller; importorg....

AI乔治 1036

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

作者|riemann_来源|blog.youkuaiyun.com/riemann_/article/details/97698560答案:controller默认是单例的,不要使用非静态的...

emprere的博客 179

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

转自:riemann_链接:blog.youkuaiyun.com/riemann_/article/details/97698560controller默认是单例的,不要使用非静态的成员变量,否则...

码农code之路 227

Spring的controller是单例还是多例,怎么保证并发的安全?

controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。 我们下面来简单的验证下: package com.riemann.springbootdemo.controller; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.

一蓑烟雨任平生 758
上一篇: Job定时任务的几种创建方式
下一篇: 为什么BAT强制 boolean 类型变量不能使用 is 开头?
Colin1113
博客等级 码龄10年 16粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值