java - 如何在反序列化时重新附加单例 Spring bean

标签 java spring serialization dynamic-proxy

我想在反序列化之后将单例范围的依赖项重新注入(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/

相关文章:

java - Bean 属性不可读或具有无效的 getter 方法

Spring Security 更新身份验证成功后的上次登录日期

spring - Redis 中的并发用于分布式系统中的闪购

python - Django REST Framework 序列化一对一模型

wpf - 需要序列化位图图像 silverlight

java - decodeByteArray 和 copyPixelsToBuffer 不工作。 SkImageDecoder::Factory 返回空

java - 在 session 中存储 Axis 原始 XML 请求/响应(用于 JSP)

class - 如何设计一个版本转换器(Json.net),在没有太多代码污点的情况下将非常旧的版本处理为新版本

javascript - 在 Angular js中将字节数组显示为图像

java - Spring 请求映射 : differentiate PathVariable with different types