小编典典

Spring会话范围的Bean(控制器)和对服务的引用(从序列化角度而言)

spring

  • 一个标准的案例-你有一个带有的控制器(@Controller)@Scope("session")
  • 通常希望实现会话中放置的类,Serializable以便在重新启动服务器的情况下可以物理存储它们,例如
  • 如果控制器实现Serializable,这意味着它引用的所有服务(其他spring bean)也将被序列化。它们通常是代理,并引用事务管理器,实体管理器工厂等。
  • 某些服务,甚至控制器,都不太可能ApplicationContext通过实现实现对的引用ApplicationContextAware,因此这可以有效地意味着整个上下文都已序列化。考虑到它拥有许多连接-即无法通过思想序列化的事物,它将以损坏状态恢复。
    到目前为止,我几乎都忽略了这些问题。最近,我想到了声明我所有的spring依赖项,transientreadResolve()通过静态实用程序类将它们重新获得WebApplicationContextUtils,从而将request / ServletContext保留在ThreadLocal。这很繁琐,但是可以保证在反序列化对象时,其依赖关系将与当前应用程序上下文保持“最新” 。

是否对此有任何公认的实践,或者是否有任何序列化spring上下文部分的准则。

请注意,在JSF中,托管bean(〜controllers)是有状态的(不同于基于动作的Web框架)。因此,也许我的问题更多地代表JSF,而不是spring-mvc。


阅读 345

收藏
2020-04-13

共1个答案

小编典典

在此演示文稿中(大约1:14),发言者说,此问题在Spring 3.0中通过提供不可序列化的bean代理得以解决,该代理可从当前应用程序上下文(反序列化)中获取实例。

2020-04-13