在整个会话期间用Java创建单个HashMap实例

时间:2015-11-29 17:44:47

标签: java spring dictionary static-methods static-members

我正在开发一个项目,我需要在整个程序执行过程中存储一组键和值。在服务器启动时的含义,我希望有一个存储数据的映射,并且对于在该会话中发出的多个请求是相同的。

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

我使用了静态映射,但是注意到即使在停止服务器并再次运行它之后,映射实例也具有来自上一个会话的值,而不是在请求开始时它是null。物体没有被正确销毁。

如果我将使用bean,这种行为会改善吗?

1 个答案:

答案 0 :(得分:0)

您必须定义什么是Session

通常,在Web项目中,会话与HTTP Session相关。这些是在@Scope(value = WebApplicationContext.SCOPE_SESSION)由Spring管理的。 Bean将有一个代理,自动管理服务的实例。

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

如果您将会话定义为服务器进程的开始和结束,那么很好。

因此,为了创建这个地图,我应该创建一个静态Map还是为它创建一个单独的bean并使用自动装配?

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

在您的情况下,Bean的主要优势是Inversion of Control的{​​{1}}。

我使用了静态地图,但注意到即使在停止服务器并再次运行它之后,地图实例也有来自前一个会话的值

通常,当服务器关闭时,对象将丢失其数据,除非您的Map已由服务器Unit Tests存储在磁盘上的会话文件中。也许你应该尝试将静态Map移动到它自己的Class。

如果我使用bean,这种行为会改善吗?

不,行为会一样。

请勿忘记,作为单身人士,您的地图必须与Serialized同步。否则,使用它时会有惊喜。