- 一个标准案例 - 你有一个带有
@Scope("session")
的 Controller (@Controller
)。 - 放置在 session 中的类通常需要实现
Serializable
,以便在服务器重启时可以物理存储它们,例如 - 如果 Controller 实现了
Serializable
,这意味着它所引用的所有服务(其他spring bean)也将被序列化。它们通常是代理,引用事务管理器、实体管理器工厂等。 - 通过实现
ApplicationContextAware
,某些服务甚至 Controller 持有对ApplicationContext
的引用并非不可能,因此这实际上意味着整个上下文是序列化。并且鉴于它拥有许多连接 - 即无法通过想法序列化的事物,它将在损坏状态下恢复。
到目前为止,我大多忽略了这些问题。最近我想声明我所有的 spring 依赖项 transient
并通过静态实用程序类 WebApplicationContextUtils
将它们返回到 readResolve()
中,这样就可以保存ThreadLocal
中的请求/ServletContext。这很乏味,但它保证当对象被反序列化时,它的依赖关系将与 当前 应用程序上下文“最新”。
是否有任何公认的做法,或序列化部分 Spring 上下文的任何指南。
请注意,在 JSF 中,托管 bean(~ Controller )是有状态的(与基于操作的 Web 框架不同)。所以也许我的问题更多地代表 JSF,而不是 spring-mvc。
最佳答案
在 this presentation (大约 1:14)演讲者说这个问题在 spring 3.0 中通过提供不可序列化 bean 的代理得到解决,该代理从 当前 应用程序上下文(反序列化)获取实例
关于java - 就序列化而言,Spring session 范围的 bean( Controller )和对服务的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180963/