清除序列化后连接变量的方法?

时间:2016-03-18 10:55:21

标签: java spring tomcat serialization zk

我有一个Web应用程序(tomcat 7,spring 4.2,ZK 7)。由于我有两个可以“接管”其他会话的服务器,因此需要序列化会话,这导致了在反序列化后我必须以某种方式重新初始化spring服务的问题。由于ZK的结构,需要序列化Composers(控制器类型)(并且这些Composers使用服务)。

例如,假设我有一个需要序列化的对象。这个对象引用了一个Spring服务(无法序列化,因为最后有一个对DataSourceSqlSessionTemplate等的引用 - 所有这些都不是Serializable) 。

那么,现在如何优雅地解决这个问题呢?有没有办法将Spring集成到反序列化过程中,以便Spring在反序列化之后(甚至在反序列化时)自动重新连接我的(瞬态,自动装配)变量?

当前的解决方案是让一个单独的bean位于对ApplicationContext的@Autowired引用,这样我就可以通过getInstance()访问它来获取对Service的引用,但是这个解决方案不是非常优雅,也使测试更复杂(因为我更喜欢单元测试而不加载Spring上下文)。

还有其他一些,最好更好的方法吗?

1 个答案:

答案 0 :(得分:1)

看来,最明显和优雅的答案是声明bean的ScopedProxyMode,将其包装到Proxy中并动态设置不可序列化的依赖项,例如......

@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)

可以在Spring文档here中找到更多内容。这已经在StackOverflow上讨论了here(当他们宣布演示文稿时会有演示文稿的链接)。