SpringBoot单页应用程序并发

时间:2018-05-18 16:18:21

标签: java spring-boot concurrency single-page-application

我复制了一个示例Spring Boot SPA。我想了解,如果多人通过URL使用网页会发生什么。 Java是否每次调用都会创建Web应用程序的实例?内存资源不是共享的,即如果附加了列表对象,每个用户都会看到自己的列表?

3 个答案:

答案 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应用程序中实例化一次,每个请求都调用同一实例上的方法。