繁体   English   中英

在整个会话过程中使用Java创建HashMap的单个实例

[英]Create a single instance of HashMap in Java throughout the session

我正在一个项目中,在该项目中,我需要在程序执行的整个过程中存储一组键和值。 意思是当服务器启动时,我想要一个存储数据的映射,并且该会话中的多个请求都相同。

因此,对于创建此地图,我应该制作一个静态地图还是为其创建一个单例bean并使用自动装配 哪个更好?

我使用了静态映射,但是注意到即使在停止服务器并再次运行它之后,该映射实例仍具有上一个会话的值,而在请求开始时它应该为null。 这些对象未正确销毁。

如果我将使用bean,这种行为是否会得到改善?

您必须定义什么是Session

通常,在Web项目中,会话与HTTP Session 这些在Spring中通过@Scope(value = WebApplicationContext.SCOPE_SESSION) Bean将具有一个代理,可自动管理您的Service实例。

在这种情况下,您不想使用Static Map 实际上,静态对象是程序的全局对象,并且在任何时候都只会存在一个实例,例如Singleton

如果将会话定义为服务器进程的开始和结束,则可以。

因此,对于创建此地图,我应该制作一个静态地图还是为其创建一个单例bean并使用自动装配?

这接近同一件事。 唯一的区别是如何实例化它。 加载Class ,JVM将立即创建一个静态Map。 Spring会在第一次使用时创建Singleton Bean。

在您的情况下,Bean的主要优点是Unit Tests Inversion of Control

我使用了静态映射,但是注意到即使停止服务器并再次运行它之后,映射实例仍具有上一个会话的值

通常,关闭服务器后,对象将丢失其数据,除非服务器将Map Serialized并存储在磁盘上的会话文件中。 也许您应该尝试将静态Map移至其自己的Class。

如果我将使用bean,这种行为是否会得到改善?

不,行为将是相同的。

不要忘了,作为一个单例,您的Map必须与Collections.synchronizedMap()同步。 否则,使用时会感到惊讶。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM