浅谈Spring中的@Controller注解

2023-11-08

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

controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。

@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”)

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

相信大家不难发现 :
单例是不安全的,会导致属性重复使用。

解决方案

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

补充说明

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

2.prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;
(下面是在web项目下才用到的)

3.request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听;

4.session:每次会话,同上;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈Spring中的@Controller注解 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 【LeetCode-简单题 KMP匹配算法】28. 找出字符串中第一个匹配项的下标

    文章目录 题目 方法一 常规做法 一次一次截取再做比较 方法二 KMP匹配算法 题目 方法一 常规做法 一次一次截取再做比较 class Solution public int strStr String haystack String n
  • Letcode数组相关算法

    查找数组第K大数字 题意 查找一个数字第k大数字 如数组a 1 2 3 4 5 6 它的第2大数字就是5 代码 快排思路解决 在一个数组查找最k大数字 public static int findKthLargestNum int nums
  • windows文件夹挂载至Linux中

    背景 我们准备的安装包是需要在linux上使用docker compose进行部署 其中一个服务依赖GPU进行计算 需要能够使用到GPU 然而客户提供的是Windows服务器 且不能重装系统 并且最最最重要的是 NVIDIA的卡无法通过Hy
  • 解决ECharts关系点击图例节点偏移问题

    首先说问题原因 如果在没有设置x和y的坐标会出现这个问题 因为ECharts会开启自动布局算法所以在点击图例之后又将对应的图例进行的算法布局 所以才会导致数据偏移 解决办法 1 设置layout为none 禁止开启算法布局 layout n
  • 重排链表小结

    重排链表小结 又发现一道好玩的题目 顺带来复习一下之前学过的知识吧 Leetcode题目 143 重排链表 给定一个单链表 L 的头节点 head 单链表 L 表示为 L0 L1 Ln 1 Ln 请将其重新排列后变为 L0 Ln L1 Ln
  • Contruct 2制作的HTML5游戏的简单介绍

    游戏背景 在主宰大陆上生活着这样一群人 他们生来掌握着强大的魔法力量 然而自然界从来不允许什么生物可以一家独大 所以与之对应一群强大的魔法生物诞生了 一场人与兽的较量就此展开 伊琳娜是喀布尔山脉的守护者 负责保护阿帕丝女神的雕像 这天阳光正
  • windows配置了path系统环境变量但是不生效

    在配置path环境变量时发现配置的环境变量压根没有效果 但是环境变量内容也没写错 那多半是这个原因 正确的 C Program Files x86 NVIDIA Corporation PhysX Common SystemRoot sys
  • zabbix通过IPMI监控硬件环境(温度和风扇)

    IPMI Intelligent PlatformManagement Interface 即智能平台管理接口是使硬件管理具备 智能化 的新一代通用接口标准 用户可以利用 IPMI 监视服务器的物理特征 如温度 电压 电扇工作状态 电源供应
  • Windows通过计划任务定时执行bat文件

    首先打开Windows系统的 开始 菜单 从中依次点选 程序 附件 系统工具 任务计划程序 命令 点击 创建任务 后如图所示 填写好相应的名称和勾选好必要的条件 选择 触发器 选项 点击 新建 创建任务执行时间 重复任务间隔 这个选择后 后
  • 常见登录鉴权方案

    编者注 今天我们分享的是卢士杰同学整理的网站常用鉴权方案的实现原理与实现以及他们的适用场景 帮助大家在业务中做合适的选择 背景 说起鉴权大家应该都很熟悉 不过作为前端开发来讲 鉴权的流程大头都在后端小哥那边 本文的目的就是为了让大家了解一下
  • 360的服务器在哪个文件夹,如何卸载服务器上顽固的360

    前几天接触到一台戴尔R410的服务器 已经尘封两年 忘记密码无法进入系统 系统是经典的windows server 2003 于是直接用量化好暗组优盘系统的U盘启动 在这里要注意下 服务器的按del是没用的 需要按F12 进入后 选择u盘启
  • 服务器装win10稳定吗,win11发布了,那么电脑安装win11稳定吗?win11稳定性介绍

    近期新的win11系统出去后 绝大多数用户都很希望 但也是有许多平稳用户由于还不知道这一系统如何 因此迟疑需不需要升级 实际上 现在是预览版系统镜像系统 或多或少会出现一点bug 但整体而言或是相对稳定 下面大家一起来看看win11平稳吗的
  • 代码随想录训练营第五十九天

    1 下一个更大元素II 题503 循环数组有两种方法 一是用同一个数组拼接成两个数组 实现假循环 二是遍历两遍 用求余的方法 求余的方法更简便 class Solution public vector
  • java 变量的生命周期

    这个要从作用域开始说起 像局部变量的作用域就是他的生命周期 比如if for switch等等这些 出了这个结构就销毁了 方法里的局部变量 在方法调用完就销毁 如果是类的成员变量 在类的相应的对象销毁的时候销毁 上面说的是普通变量 如果是静
  • 卷积处理过程模拟:用Python实现OpenCV函数filter2D等效的卷积功能

    一 引言 在 OpenCV Python 图像平滑处理 卷积函数filter2D详解及均值滤波案例 介绍了filter2D相关的功能及使用 下面老猿用Python numpy矩阵运算以及OpenCV Python的图像基础操作模拟实现一个卷
  • mybatis之执行sql语句

    写在前面 通过这篇文章的分析 已经生成了可以执行的sql语句了 本文来分析SQL语句具体的执行过程 想要系统学习的 可以参考这篇文章 重要 入口 当我们执行一次数据查询的时候 mybatis会通过org apache ibatis exec
  • 4路组相连cache设计_cache基本原理

    为什么要了解cache 在学习linux kernel的过程 经常会cache的概念 从软件层面的page buffer cache 再到硬件层面中CPU的L1 L2 L3 cache TLB 磁盘内部的硬件cache 以及编程时的cach
  • 集合框架--双向链表的模拟实现

    Java中的鏈表 分為三種 1 單向鏈表 由一個節點元素 可以找到相鄰的下一個節點元素 2 雙向鏈表 由一個節點元素 可以找到其相鄰的前 后節點元素 3 循環鏈表 由一個節點元素 可以找到其相鄰的前 后節點元素 由最后一個節點元素可以找到第
  • notepad使用回车与换行

    转载于 http www pythontab com html 2017 linuxkaiyuan 0115 1116 html 一 回车与换行定义 回车 r 本义是光标重新回到本行开头 r的英文return 换行 n 本义是光标往下一行
  • 浅谈Spring中的@Controller注解

    Spring 的 Controller 是单例还是多例 怎么保证并发的安全 controller默认是单例的 不要使用非静态的成员变量 否则会发生数据逻辑混乱 正因为单例所以不是线程安全的 Controller public class S