我正在开发一个项目,我需要在整个程序执行过程中存储一组键和值。在服务器启动时的含义,我希望有一个存储数据的映射,并且对于在该会话中发出的多个请求是相同的。
因此,要创建此地图,我应该制作静态地图还是为其创建单例bean并使用自动装配?哪个更好?
我使用了静态映射,但是注意到即使在停止服务器并再次运行它之后,映射实例也具有来自上一个会话的值,而不是在请求开始时它是null。物体没有被正确销毁。
如果我将使用bean,这种行为会改善吗?
答案 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
同步。否则,使用它时会有惊喜。