首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SpringMVC @Scope会话未创建线程

SpringMVC @Scope会话未创建线程
EN

Stack Overflow用户
提问于 2013-05-12 19:01:37
回答 2查看 5.4K关注 0票数 1

假设我有下面的类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
public class WebController {
    @Autowired PersonService personService;


    @RequestMapping(value = "/get", method = RequestMethod.GET)
    @ResponseBody
    @Scope("session")
    public List<Player> getPerson(String personName) {
        return playerService.getByName(personName);
    }
}

现在,这将调用以下服务...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service("playerService")
public class PlayerServiceImpl implements PlayerService {
private List<Player> players;
@Override
    @Transactional
    public List<Player> getByName(final String name) {
        if (players == null) {
            players = getAll();
        }
        return getValidPlayers(name);
    }

如果我最初启动我的应用程序,players是空的,正确的,然后在同一会话中,我用一个新的值再次调用这个方法,players不再是空的,正如你所期望的。但是,似乎没有创建新的线程,如果我打开一个新的浏览器窗口(因此创建了一个新的会话)并调用此方法,它仍然具有前一个会话中的值。

为什么@Scope("session")不在线程池中创建一个新线程?

不出所料,我已经在servlet上下文中指定了<context:component-scan base-package="com." />,除了服务方法都作为单例运行,而不是像Java容器那样为每个会话创建一个新线程外,其他一切都运行得很好。

如果播放器被标记为静态,我可以理解。

我还尝试将我的控制器标记为@Scope("session") (如下所示),但这似乎也没有任何影响。让我的Spring应用程序为新会话创建新线程的最好方法是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
@Scope("session")
public class PlayerController {
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-12 19:14:07

您正在以错误的方式使用@Scope注释。

引用docs

当与组件批注一起用作类型级批注时,

指示用于带批注的类型的实例的作用域的名称。

当与Bean注释一起用作方法级注释时,表示用于从方法返回的实例的作用域的名称。

因此,如果您使用的是java config,则可以注释spring组件bean或创建bean的方法。Java配置是它编译的唯一原因(在3.0版本之前的spring中不会)

在您的例子中,注释位于普通的bean方法上,它没有任何意义。

解决正确的问题

看起来您正试图通过将查询结果存储在List<Player> players中来实现db缓存。

别干那事。取而代之的是使用一个预先构建的缓存抽象(spring有一个非常好的)。

因此, @Scope 应该去哪里?

@Scope("session")注释@Controller不会有什么帮助,因为它将创建会话作用域控制器,但它们注入的服务仍然是单例的。

只注释Service bean也不起作用,因为@Controller是一个单例,它的依赖关系在应用程序启动时自动连接。

同时注释@Service@Controller可能会起作用,但看起来有点笨拙。

最好是完全避免使用state。

票数 3
EN

Stack Overflow用户

发布于 2013-05-12 19:43:12

为每个请求创建新的线程。

您的服务有一个实例变量(播放器),它不是threadsafe -它由所有线程共享。默认情况下,任何spring bean -包括控制器和服务都是单例的,您需要在服务注释中指定其作用域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service("playerService")
@Scope("session")
public class PlayerServiceImpl 

但最好(更简单,更容易扩展)让bean保持单例,而不依赖于实例变量(除非它们也是由spring/threadsafe/ singletons管理的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16510976

复制
相关文章
R:purrr包用于循环迭代
purrr中有多个迭代函数,可以用于快速解决循环迭代的问题,purrr中常用的迭代函数有map、map2、walk、reduce等等。
生信菜鸟团
2020/07/16
1.6K0
R中的循环绘图
上面我们将每一张图都单独输出了,下面来介绍如何将其全部组合起来,分别介绍两种R包的方法gridExtra&patchwork
R语言数据分析指南
2022/09/21
4.1K0
R中的循环绘图
【Kotlin 协程】Channel 通道 ② ( Channel 通道容量 | Channel 通道迭代 | 使用 iterator 迭代器进行迭代 | 使用 for in 循环进行迭代 )
直到 调用 Channel#receive 函数 取走了缓冲区中的数据 , 缓冲区 有了空间 , Channel#send 函数才会恢复执行 ;
韩曙亮
2023/03/30
7580
【Kotlin 协程】Channel 通道 ② ( Channel 通道容量 | Channel 通道迭代 | 使用 iterator 迭代器进行迭代 | 使用 for in 循环进行迭代 )
matlab循环求和_r语言for循环计算求和
编写程序求和 S=a+aa+aaa+aaaa+…,其中a 是1-9 中的一个数字。n 为一正整数, a 和n均从键盘输入。(例如输入n 为4,a 为2,S=2+22+222+2222)
全栈程序员站长
2022/11/08
1.2K0
OpenGL进行简单的通用计算实例
博主作为OpenGL新手,最近要用OpenGL进行并行的数据计算,突然发现这样的资料还是很少的,大部分资料和参考书都是讲用OpenGL进行渲染的。好不容易找到一本书《GPGPU编程技术,从OpenGL、CUDA到OpenCL》,里面对并行处理的发展进行了系统性的介绍,还是很不错的。小白博主很兴奋,看完书中第三章后恍然大悟了很多,就贴出书中代码3-3的例子,实现一番,并用一副图片数据做了实现。 实现环境:Window7 32bit, VS2013+OpenGL3.3+GLEW+GLFW。 OpenGL用来进行
一棹烟波
2018/01/12
2.1K0
OpenGL进行简单的通用计算实例
迭代循环:for语句
• 简单类型用来表示值:整数int、浮点数float、复数complex、逻辑值bool、字符串str
陆勤_数据人网
2020/08/27
8200
【R语言】计算10亿以内for循环加速
笔者主力机是MBAM1芯片(8+256),某个下午巩固循环突然思考到个问题,小循环很快就能run出来,中循环还勉勉强强,稍微上点强度就运行的很慢。虽然是CPU占用100%,8颗核心好像是偷着懒跑的,但是丢给我那台4核心8线程黑苹果,是跑满的,说明ARM在多线程的时候,有点东西
生信初学者
2023/05/06
5360
计算机基础,Python基础--变量以及简单的循环
一、计算机基础 1.CPU   相当于人体的大脑,用于计算处理数据。 2.内存    用于存储数据,CPU从内存调用数据处理计算,运算速度很快。 PS:问:既然在内存里的数据CPU运算速度快,为什么计算机不全部用内存呢?   答:1.内存成本很高;2.计算机断电时,在内存里的数据会即刻消失;因此计算机不会全部使用内存存储数据。 3.硬盘   用于储存应该长久保存的数据和文件等。硬盘分两种,固态硬盘和机械硬盘。固态硬盘(Solid State Drive)用固态电子存储芯片阵列而制成的硬盘,由控制单元和
新人小试
2018/04/12
8750
python - 可迭代/迭代器对象、for循环原理
目录 可迭代对象与迭代器对象 for循环本质 可迭代对象与迭代器对象 迭代:迭代的意思就是更新换代,每次的更新都必须依赖上一次的结果 迭代其实给我们提供了一种不依赖索引取值的方式 可迭代对象: 内置有 _ _ iter _ _方法的都称为可迭代对象 有字符串、列表、元组、字典、集合、文件对象 迭代器对象: 内置有 _ _iter _ _ 方法,又含有 _ _next _ _方法称为迭代器对象 文件本身即是可迭代对象,也是迭代器对象 可迭代对象调用_ _it
HammerZe
2022/03/25
9330
如何用R语言进行云计算
作者 | Ajay Ohri 翻译 | 丁雪 校对 | ValaWong 如今,几乎所有领域或业务活动正在通过SMAC进行数据转换。SMAC指的是社交(Socia)、移动(Mobile)、分析(Analytics)和云服务(Cloud)。这个改变的影响已经涉及到包括组织、人员与产品在内的范围。在本文中,我们将通过使用云计算让你提高数据分析能力。 我们已经使用R语言和RStudio由浅入深地解释了云计算的相关概念(请参考大数据文章2015年9月21日发布的文章《如何在云计算平台使用R语言编程的快速入门指南
大数据文摘
2018/05/22
3.9K0
R语言中的循环补齐
--- title: "循环补齐" output: html_document date: "2023-03-08" --- 当我们对两个长度不一致的向量进行操作时,会发生什么呢? x = c(1,3,5,6,2) y = c(3,2,5) x == y ## [1] FALSE FALSE TRUE FALSE TRUE 虽然出现了提示Warning: longer object length is not a multiple of shorter object length,并没有发生报错。 从输
小叮当aka
2023/03/17
1.6K0
迭代循环丨SUMX函数
白茶在之前的一期,曾经分享过RANKX排名的问题,但是白茶当时犯了一个很严重的错误,这里和小伙伴们说一声抱歉。本期呢,既是纠正这个错误,也是学习另一个函数——迭代循环函数之SUMX。
PowerBI丨白茶
2021/09/01
1.1K0
迭代循环丨SUMX函数
ES6 的循环和可迭代对象
首先是经典的 for i 循环,它使你可以遍历数组或可索引的且有 length 属性的任何对象。
疯狂的技术宅
2020/09/01
1.9K0
ES6 的循环和可迭代对象
如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)
所以推荐使用迭代器iterator,或者JDK1.8以上使用lambda表达式进行List的遍历删除元素操作。
崔笑颜
2020/06/08
12.2K0
Python 中的迭代器
自从第4章4.2.6节出现了“可迭代的”(Iterable)一词之后,就不断遇到具有此特征的对象,比如列表、字符串、字典等。判断一个对象是否是可迭代的,主要看它是否具有 __iter__() 方法。
老齐
2021/11/15
1.1K0
r语言的for循环_两效十MVR强制循环
上述例子中直接将结果进行print,在实际应用中基本不会这么做。一般会将输出结果以向量或其他形式储存。如下:
全栈程序员站长
2022/11/17
3.8K1
r语言的for循环_两效十MVR强制循环
大学生常用python变量和简单的数据类型、可迭代对象、for循环的3用法
单下划线_ 变量 在Python中,变量可以包含数字、字母、下划线等,所以单独一个下划线_也是一个变量,表示一个临时对象,一般后续不会用到,比如:
20岁爱吃必胜客
2023/02/26
9050
大学生常用python变量和简单的数据类型、可迭代对象、for循环的3用法
R语言for循环①
for循环是一种重复控制结构,可以让您有效地编写一个需要执行特定次数的循环。 for (value in vector) { statements } 示例: j <- LETTERS[1:4] for ( i in j) { print(i) } 它产生如下结果: [1] "A" [1] "B" [1] "C" [1] "D" 下标访问 > a <- c("a","b","c","d") > for (i in c(1:length(a))) + {print(i)} [1] 1 [1] 2
用户1359560
2018/08/27
1.3K0
测试用例中的细节
编写测试用例是在实际测试执行开始之前进行的软件测试活动的重要组成部分。因此,在编写测试用例时必须头脑清晰地理解需求。测试执行阶段的顺利程度主要取决于测试用例的编写质量,还取决于对需求的理解程度。理论上来讲应避免在测试用例中放入不必要或不需要的细节,但放入必需和重要的细节反而又会起着重要的作用。
FunTester
2020/02/17
5600
点击加载更多

相似问题

Rails 4从迁移索引中删除迁移ID

32

Rails迁移:从表中删除列

11

从迁移文件中删除Rails 4.2降级

12

Rails迁移中默认值的常量。

33

在rails中删除迁移

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文