【问题标题】:Spring singleton beans across multiple application contexts跨多个应用程序上下文的 Spring 单例 bean
【发布时间】:2010-02-11 18:21:28
【问题描述】:

我们有一个 spring 应用程序(设计为单线程)。我们希望将其调整为多线程。一个想法是创建一个父线程并产生不同的线程,这些线程将实例化它们自己的应用程序上下文并并行运行。 (内存和cpu现在不是问题)。我不确定在春季如何实现单身人士。 spring 是使用静态引用并返回 this 还是使用某种缓存/映射(非静态/非单例且特定于上下文)进行查找?这将帮助我决定是否更改 config-xml。请有任何想法。

【问题讨论】:

  • 顺便说一句 - 你想跨上下文共享​​>单例,或者你想为每个上下文使用不同的签名?
  • 不,我不想跨上下文共享对象,我希望不同的对象组被不同的线程使用。我面临的挑战是整合日志和数据库事务。我不想被对象级互斥锁所困扰,至少现在不是。如果我要设置 singleton=false,我必须跨框架进行更改,不过我不太确定

标签: java multithreading spring


【解决方案1】:

Spring singleton bean 在每个应用程序上下文中实例化一次。也就是说,如果您从同一个配置创建多个应用程序上下文,它们将具有不同的单例 bean 实例。

如果您希望它们共享单例 bean 的单个实例,您可以在父应用程序上下文中声明它,并在创建它们时为您的多个上下文提供该父上下文。

【讨论】:

  • +1,虽然这里使用术语单例具有误导性。它们是应用程序上下文范围内的单例,但不会超出此范围。
【解决方案2】:

为什么您需要多个应用程序上下文来使应用程序成为多线程的?多个线程可以完美地使用相同的上下文。

更新:Take a look at spring batch

【讨论】:

  • 这将涉及引入同步部分,这是一个痛点,尤其是对于没有单元测试的代码
  • 如果要修改相同的数据,则无法避免同步部分。
【解决方案3】:

在我看来,您确实需要查看您的单例 bean 实际在做什么以及它们在多线程环境中的功能。我不会尝试更新您的应用程序上下文以适应您的线程模型,而是更新 bean 的生命周期以使其适合。

  • 如果它们是真正的单例并且本质上是线程安全的,那么只需将它们与多线程一起使用即可。
  • 如果它们不是线程安全的,那么它们是否应该在您的新的多线程实现中继续作为弹簧单例?将它们更新为每个线程实例化的非单例 bean,然后尝试将整个应用程序上下文绑定到特定线程可能更有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多