我复制了一个示例Spring Boot SPA。我想了解,如果多人通过URL使用网页会发生什么。 Java是否每次调用都会创建Web应用程序的实例?内存资源不是共享的,即如果附加了列表对象,每个用户都会看到自己的列表?
答案 0 :(得分:1)
@Service
和@Repository
以及@RestController
等春季资源是无国籍单身人士。仅创建一个实例来为应用程序提供服务。
您在范围级别执行列表将确定是否共享该列表。如果您在Controller中定义列表,如您的示例所示,那么每个用户都可以访问相同的列表。您可以使用多个浏览器来查看列表是否已共享。基于这个例子,这很好,因为获得“所有”应该真正意味着获得所有。
如果您希望每个用户都拥有自己的列表,则必须实现某种会话或后端流程,以便将每个用户与自己的列表相关联。
答案 1 :(得分:1)
spring-boot bean的默认范围是singleton
。假设你的bean没有管理状态,你可以使用默认行为:
https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
4.4.1单身范围
当一个bean是一个单例时,只管理一个bean的一个共享实例,并且所有bean的请求都是 匹配该bean定义的id或id将导致该定义 Spring容器返回的特定bean实例。
换句话说,当你定义一个bean定义时,它就是 作为一个单例,然后Spring IoC容器将创建 恰好是该bean定义定义的对象的一个实例。 该单个实例将存储在这种单例的缓存中 bean,以及该命名bean的所有后续请求和引用 将导致返回缓存的对象。
现在,如果您正在使用有状态的bean并希望每个请求使用一个新bean,则可以将该bean的范围定义为prototype
:
4.4.2原型范围
bean的非单例原型范围部署导致每次创建一个新的bean实例 对该特定bean的请求(即,它被注入 另一个bean或通过编程的getBean()方法请求它 打电话给容器)。根据经验,你应该使用 所有有状态bean的原型范围,而单身人士 范围应该用于无状态bean。
答案 2 :(得分:1)
这不是共享 - 没有像PHP或Rails。 Java启动速度很慢,因此无法为每个请求启动应用程序的新实例。
查看spring-boot示例应用程序源代码,SpringbootJQueryAjaxClientApplication类上有一个main方法,如下所示:
public static void main(String[] args) {
SpringApplication.run(SpringBootJQueryAjaxClientApplication.class, args);
}
这是任何Java程序的主要方法,这里发生的是它启动自托管servlet容器并将应用程序安装到其中,然后等待http请求。
这是一个进程,每个请求都由一个线程提供,因此内存是共享的。像com.javasampleapproach.jqueryajax.controller.RestWebController(默认为作为单一格式)的Spring组件在Web应用程序中实例化一次,每个请求都调用同一实例上的方法。