[英]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.