Java ServletRegistrationBean是否为每个注册的子WebApplicationContext使用不同的类加载器

Java ServletRegistrationBean是否为每个注册的子WebApplicationContext使用不同的类加载器,java,spring,spring-boot,classloader,Java,Spring,Spring Boot,Classloader,在这种情况下,我使用ServletRegistrationBean,将两个子web应用程序上下文注册到Spring父web应用程序上下文中,为每个子应用程序上下文提供不同的DispatcherServlet实例。每一个都是在不同的上下文路径下服务的 这里的主要问题是,每个ServletRegistrationBean都有一个使用相同第三方库的bean,该库使用的是来自静态成员的getInstance()。预期的行为是每个ServletRegistrationBean有一个该类的实例。因此,当从第

在这种情况下,我使用
ServletRegistrationBean
,将两个子web应用程序上下文注册到Spring父web应用程序上下文中,为每个子应用程序上下文提供不同的
DispatcherServlet
实例。每一个都是在不同的上下文路径下服务的

这里的主要问题是,每个
ServletRegistrationBean
都有一个使用相同第三方库的bean,该库使用的是来自静态成员的
getInstance()
。预期的行为是每个
ServletRegistrationBean
有一个该类的实例。因此,当从第二个
ServletRegistrationBean
调用
getInstance()
时,将提供新实例,而不是在第一个
ServletRegistrationBean
中创建的实例


问题是,两个不同的
ServletRegistrationBean
中的bean是否将被创建,并且在内部将使用不同的classloader实例?

根据Spring文档:

请注意,Spring的单例bean的概念非常简单 与开创性的一帮人中定义的独生子女模式不同 四(GoF)模式书。GoF Singleton硬编码 对象,使特定类的一个且仅一个实例 是否为每个类加载器创建。Spring单例的范围是 最好按照容器和bean来描述

因此,我相信,将创建两个不同的ServletRegistrationBean。如果你需要一个真正的单例,你需要用老式的方法来实现它——私有构造函数,一个静态的getInstance方法和代码来处理序列化,如果你实现了serializable。 详情如下:

实际上,我有两个不同的bean使用同一个库中的类,该类和GoF中的类一样是单例的。如果不同ServletRegistrationBean下的每个bean使用不同的类加载器,我将从该库中获得不同的单例类。这是理想的情况。只是重新检查它是否是Spring的预期行为。是的,它是预期行为。