如果应用程序关闭并在 Spring MVC 中再次启动,是否会在 WebApplicationContext 中创建 Singleton 范围对象的新实例

Will a new instance of Singleton scoped object in a WebApplicationContext be created if the application is closed and started again in Spring MVC

在 Spring MVC 应用程序中,如果应用程序关闭然后再次启动,是否会在 WebApplicationContext 中创建新的 Singleton Class 实例?

假设有一个单例范围的 DAO class,其中一些成员变量(状态)在应用程序中被修改,然后应用程序被关闭。 现在,当我们再次 运行 该应用程序时,之前的更改(在应用程序关闭之前所做的)是否仍然存在于该 DAO 中,或者当应用程序重新启动时它将是一个新的单例实例?

新的单例实例。

假设“单例”指的是 bean 作用域:

  • Singleton scoped bean是在应用程序启动时由IoC容器创建的,然后存储在那里。因此,无论何时您注入特定类型的 class,IoC 容器 returns 它创建的单个实例

  • IoC container in Spring applications can configure bean only according to configuration metadata (check annotation-based and java-based configuration). IoC container is represented by ApplicationContext class.

ApplicationContext 仅在应用程序存在时“存在”。当应用程序停止时,ApplicationContext 终止,并丢失所有 bean 及其所有变量值。

DAO pattern concerns creating interface for communication with data source (in persistence layer, by using e.g. EntityManager,正确配置元数据存储在例如application.properties)。如果你有一个域对象(对象,“代表”数据库记录),它已经在应用程序内部被修改并且没有保存在外部的某个地方(例如在数据库中),那么当应用程序停止时它会丢失。

如果它是一个 Web 应用程序,那么当服务器停止或取消部署给定的 war 如果 war 是工件,或者如果是 jar(嵌入式服务器,如spring boot) 应用程序通过退出来终止程序来关闭。 在这种情况下,当应用程序退出时,jvm 进程也会退出,应用程序中的 spring 容器也会随之退出,当 spring 容器不再启动时,其中包含的对象也将退出不可用。

因此,您将在应用重启时获得一个新实例。