【发布时间】:2011-01-21 03:52:20
【问题描述】:
如何将依赖项注入到反序列化的 bean 中?
我的一些 Spring bean 应该在我们的 JSF 应用程序的呈现响应阶段进行序列化,然后在下一个请求开始时进行反序列化。其中一些 bean 具有范围为请求的依赖项。如果我使用作用域代理 ("<aop:scoped-proxy>") 配置依赖项,我无法序列化我的依赖 bean - 代理不可序列化。
所以现在我们通过将序列化 bean 类的适当成员变量声明为瞬态来做到这一点,然后在反序列化 bean 之后调用 context.getAutowireCapableBeanFactory().configureBean(bean, name) ——但这很糟糕,因为再次调用了 bean 的初始化程序。 (至于其他在同一范围内,不是瞬态的,并且是反序列化的,我什至不确定为什么它们不会被configureBean 覆盖,但我不认为它们是。)
什么更好?我是否应该只获取 bean 定义,循环遍历它,找到请求范围内的依赖项,然后在上下文中调用 getBean(name)?
(顺便说一句,我不确定这会有所不同,但我们使用 Spring 有点奇怪。我们为每个非回发 HTTP 请求实例化一个新的 ClassPathXmlApplicationContext,而不是单个 WebApplicationContext。根据回发,我们反序列化 bean。所以当我说“范围为请求”时,我在撒谎;这些 bean 实际上是单例范围的。我想使用 WebApplicationContext 和更理智的范围,但到目前为止据我所知,这与我们目前的问题是正交的。)
【问题讨论】:
-
为每个(一些)请求实例化一个新的上下文不可能是正确的方法......你序列化什么样的bean?他们的目的是什么?我怀疑有一个更好的设计解决方案可以消除你现在面临的问题(如果你保持现状,其他人会得到钱)
-
这似乎是错误的方法 - 同意。它是在我们将使用 Spring 的应用程序集成到我们的系统中时创建的。但是这种集成似乎很糟糕。
-
最后我在同一个问题上发布了另一个问题;最终我自己写了一个解决方案,并作为答案发布:stackoverflow.com/questions/3471835/…
标签: java spring serialization jsf dependency-injection