首页 > 其他分享 >Spring MVC中控制器对象的生命周期

Spring MVC中控制器对象的生命周期

时间:2024-02-08 16:13:17浏览次数:41  
标签:session 生命周期 请求 对象 Spring request Controller MVC

一旦Controller控制器类向SpringMVC 框架进行了注册,SpringMVC 框架就会管理Controller对象的生命周期。

 

默认情况下,Controller对象的存在范围为singleton(单例),即在整个应用程序的生命周期内,一个Controller类只有一个实例。

singleton范围的优点是节省内存空间,但是也存在以下两个缺点:

(1)当大量客户请求同时访问一个Controller对象的共享数据时,容易造成并发问题。

(2) 如果一个Controller对象采用了线程同步机制,那么当大量客户请求同时访问这个Controller对象时,会导致部分处理客户请求的线程阻塞,影响Web应用的并发性能。

为了克服以上缺点,SpringMVC 框架还允许把一个Controller对象的存在范围设置为request或session:

(1)request范围:对于每一个HTTP请求,Spring MVC框架创建一个Controller对象。当完成了对这个HTTP请求的响应,Controller对象就结束生命周期。

(2)session范围:对于每一个HTTP会话,Spring MVC框架创建一个Controller对象。当这个HTTP会话结束,Controller对象就结束生命周期。

在以下代码中,ControllerA和ControllerB分别使用了@RequestScope和@SessionScope注解,它们的范围分别为request和session:

@Controller
@RequestScope   //ControllerA的存在范围为request
public class ControllerA{}

@Controller
@SessionScope   //ControllerB的存在范围为session
public class ControllerB{}

以上@RequestScope注解等价于@Scope("request");@SessionScope注解等价于@Scope("session")。

除了request和session范围,还可以把Controller对象的存在范围设为application,这意味着在整个Web应用的生命周期内,只有一个Controller对象,例如:

@Controller
@ApplicationScope   //等价于:@Scope("application")
public class ControllerA{}


SpringMVC初写(三)Controller的生命周期

 

Spring框架默认创建的对象的方式是单例,所以业务控制器Controller也是一个单例对象

由此可证明,无论是同一次请求还是同一次会话和不同请求它的对象都是相同的

然而由于对象是单例的,随之而来的产生了两个问题:

  1. 请求数据如果放在成员变量上面,会相互影响。
  2. 在处理请求比较多的时候,请求使用同一个对象处理,会导致阻塞

SpringMVC提供了request,session两个生命周期处理上述的问题

request:每次新的请求,创建一个实例

session:每次会话创建一个新的实例,就是同一个浏览器,就使用同一个实例

 

每个请求创建一个实例,类似多例“prototype”

由于每次请求都会产生新的对象,对内存的消耗比较大一般不推荐使用

 

每次会话(Session),创建一个实例

相同浏览器访问默认为同一个会话(Session)

 

标签:session,生命周期,请求,对象,Spring,request,Controller,MVC
From: https://www.cnblogs.com/JavaYuYin/p/18011891

相关文章

  • spring-cloud-stream-rabbitmq 3.1.1使用
       1.引入springcloud,springcloudalibaba,springboot依赖<!--SpringCloud微服务--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-......
  • 在spring场景下同时使用Mockito进行集成测试
    转自:GPT回答https://chat.openai.com/share/07721c36-f18e-429f-b570-d8e14b4d8b37Mockito@InjectMocks测试February8,2024 Anonymous如何使用@InjectMocks测试被代理对象ChatGPTChatGPT使用@InjectMocks来测试被代理对象是一种......
  • SpringBoot脚手架使用
    介绍脚手架可以帮助我们快速创建SpringBoot项目。Spring提供的脚手架页面地址,核心为https://github.com/spring-io/initializr这个项目,https://github.com/spring-io/start.spring.io这个项目在此基础上提供了一些额外配置,并提供了前端页面。内部是通过https://start.spri......
  • Spring6-IoC(learning)
    Spring-IoCA.控制反转IoC(InversionofControl):控制反转(设计思想)Spring通过IoC容器管理所有Java对象的实例化与初始化,控制对象间的依赖关系。将由IoC容器管理的Java对象称为SpringBean,它与使用new关键字创建的Java对象没有任何区别。IoC容器是Spring框架最重要的核心组件之一......
  • Spring Boot 集成 Redisson分布式锁(注解版)
    转载自:https://blog.csdn.net/Ascend1977/article/details/131126047        Redisson是一种基于Redis的Java驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在SpringBoot应用程序中使用Redisson可以方便地实现分布式应用......
  • Spring Boot项目常用配置整理
    〇、常用地址一、配置文件1.1bootatrap.xml#Spring配置spring:#应用名application:name:data-xx-platform#启动环境profiles:active:@spring.profiles.active@cloud:nacos:#注册中心discovery:server-addr:http://nacos......
  • delphi 主窗体的 生命周期,如何 自己管理 而不是 自动管理
    在Delphi中,窗体的生命周期通常是由VCL(VisualComponentLibrary)自动管理的。但是,你可以通过一些手段来自己管理主窗体的生命周期,而不是完全依赖于自动管理。要自己管理主窗体的生命周期,你可以考虑以下几个方面:创建窗体:你可以手动创建窗体实例,而不是依赖于Application.Cre......
  • SpringBoot简介
    1、为什么有SpringBoot?J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。2、SpringBoot是什么?是一个一站式整合所有应用框架的框架;并且完美整合Spring技术栈。SpringBoot来简化开发,约定大于配置,去繁从简,justrun就能创建一个......
  • Spring 接点、切点、切面、引入、织入、通知 概念
    importcom.github.pagehelper.PageHelper;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Pointcut;importorg.springframework.context.ann......
  • 云图说|揭秘云原生服务生命周期治理平台,云原生服务中心OSC
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 本文分享自华为云社区《【云图说】第301期初识云原生服务中心——云原生服务生命周期治理平台》,作者......