Java 跨越多个应用程序上下文的Spring单例bean

Java 跨越多个应用程序上下文的Spring单例bean,java,multithreading,spring,Java,Multithreading,Spring,我们有一个spring应用程序(设计为单线程)。我们希望将其调整为多线程。一个想法是创建一个父线程并生成不同的线程,这些线程将实例化自己的应用程序上下文并并行运行。(到目前为止,内存和cpu还不是问题)。我不确定单身在春天是如何实现的。spring是使用静态引用并返回它,还是使用某种缓存/映射(非静态/非单例和上下文特定)进行查找?这将帮助我决定是否更改配置xml。任何想法都可以。Springsingletonbean在每个应用程序上下文中实例化一次。也就是说,如果您从同一配置创建多个应用程序上

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

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


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

为什么需要多个应用程序上下文才能使应用程序多线程化?多个线程可以很好地使用同一上下文


更新:

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

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

这将涉及到同步部分的引入,这是一个难点,尤其是对于没有单元测试的代码。如果您想要修改相同的数据,您无法避免同步部分。顺便说一句-您想要跨上下文共享单例,或者您想要每个上下文使用不同的符号?不,我不想跨上下文共享对象,我希望不同的线程使用不同的对象组。我面临的挑战是整合日志和数据库事务。我不想被对象级互斥干扰,至少现在不想。如果我要设置singleton=false,我必须在整个框架中进行更改,我不太确定+1,尽管这里使用的术语singleton有误导性。它们是应用程序上下文范围内的单例,但不超出应用程序上下文范围。