我想在反序列化之后将单例范围的依赖项重新注入(inject)到原型(prototype) Spring bean 中。
假设我有一个 Process bean,它依赖于 Repository bean。 Repository bean 的作用域为单例,而 Process bean 的作用域为原型(prototype)。我定期序列化进程,然后反序列化它。
class Process {
private Repository repository;
// getters, setters, etc.
}
我不想序列化和反序列化存储库。我也不想将“transient”放在 Process 中引用它的成员变量上,也不想引用某种代理,或者除声明为 Repository 的普通旧成员变量之外的任何东西。
我想我想要的是让流程的依赖项充满一个可序列化的代理,该代理指向(具有 transient 引用)存储库,并且在反序列化时可以再次找到存储库。我如何定制 Spring 来做到这一点?
我想我可以使用代理来保存依赖引用,就像 .我希望我能使用那种精确的技术。但是我看到 Spring 生成的代理不可序列化,文档说如果我将它与单例 bean 一起使用,我会得到一个异常。
也许我可以在单例 bean 上使用自定义作用域,当被要求使用自定义作用域的 bean 时,它总是会提供一个代理。这是一个好主意吗?其他想法?
最佳答案
我用这个代替,没有任何代理:
public class Process implements HttpSessionActivationListener {
...
@Override
public void sessionDidActivate(HttpSessionEvent e) {
ServletContext sc = e.getSession().getServletContext();
WebApplicationContext newContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(sc);
newContext.getAutowireCapableBeanFactory().configureBean(this, beanName);
}
}
该示例适用于应用服务器序列化 session 时的 Web 环境,但它应该适用于任何 ApplicationContext。
关于java - 如何在反序列化时重新附加单例 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3471835/