Controller是单例还是多例?

这篇具有很好参考价值的文章主要介绍了Controller是单例还是多例?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Controller是单例还是多例?

controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。

我们下面来简单的验证下:

package com.riemann.springbootdemo.controller;
 
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ScopeTestController {
 
 
    private int num = 0;
 
 
    @RequestMapping("/testScope")
    public void testScope() {
        System.out.println(++num);
    }
 
 
    @RequestMapping("/testScope2")
    public void testScope2() {
        System.out.println(++num);
    }
 
 
}

我们首先访问 http://localhost:8080/testScope,得到的答案是1;

然后我们再访问 http://localhost:8080/testScope2,得到的答案是 2。

得到的不同的值,这是线程不安全的。
接下来我们再来给controller增加作用多例 @Scope(“prototype”)

package com.riemann.springbootdemo.controller;
 
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
@Scope("prototype")
public class ScopeTestController {
 
 
    private int num = 0;
 
 
    @RequestMapping("/testScope")
    public void testScope() {
        System.out.println(++num);
    }
 
 
    @RequestMapping("/testScope2")
    public void testScope2() {
        System.out.println(++num);
    }
 
 
}

我们依旧首先访问 http://localhost:8080/testScope,得到的答案是1;

然后我们再访问 http://localhost:8080/testScope2,得到的答案还是 1。

相信大家不难发现 :

单例是不安全的,会导致属性重复使用。

解决方案
不要在controller中定义成员变量。

万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。

在Controller中使用ThreadLocal变量

补充说明
spring bean作用域有以下5个:

singleton: 单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;

prototype: 原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;

(下面是在web项目下才用到的)

request: 搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听;

session: 每次会话,同上;

global session: 全局的web域,类似于servlet中的application。文章来源地址https://www.toymoban.com/news/detail-645310.html

到了这里,关于Controller是单例还是多例?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是单例模式

    所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 单例模式有两种方式:1) 饿汉式 2) 懒汉式 演示 饿汉式 和 懒汉式 单例模式的实现。 步骤如下: 构造器私有化 =》 防止其

    2024年02月12日
    浏览(34)
  • 如何证明Servlet是单例的?

    Servlet是web体系里面最重要的部分,下面罗列几道常见的面试题,小伙伴们一定要好好记住哈。 Servlet一般都是单例的,并且是多线程的。如何证明Servlet是单例模式呢?很简单,重写Servlet的init方法,或者添加一个构造方法。然后,在web.xml中配置。如: 然后是MyServlet 启动Tom

    2024年02月06日
    浏览(47)
  • 单例模式和多例模式和工厂模式

    学习目标 能够使用单例设计模式设计代码 内容讲解 正常情况下一个类可以创建多个对象 如果说有时一个对象就能搞定的事情 , 非要创建多个对象 , 浪费内存!!! 1.1 单例设计模式的作用 单例模式,是一种常用的软件设计模式。通过单例模式可以保证项目中,应用该模式的这个

    2024年02月12日
    浏览(24)
  • 【设计模式】单例模式、“多例模式”的实现以及对单例的一些思考

    单例模式是设计模式中最简单的一种,对于很多人来说,单例模式也是其接触的第一种设计模式,当然,我也不例外。这种设计模式在学习、面试、工作的过程中广泛传播,相信不少人在面试时遇到过这样的问题:“说说你最熟悉的集中设计模式”,第一个脱口而出的就是单

    2024年02月07日
    浏览(37)
  • Spring为什么默认是单例的?

    目录 一、五种作用域 二、单例bean与原型bean的区别  三、单例Bean的优势与劣势 一、五种作用域 1.singleton: singleton是Spring Bean的 默认作用域 ,也就是单例模式。在整个应用程序中,只会创建一个实例,Bean的所有请求都会共享这个实例。 2.prototype: prototype表示 原型模式 ,每次

    2024年02月07日
    浏览(30)
  • 【设计模式学习1】什么是单例模式?单例模式的几种实现。

    单例模式是在内存中只创建一个对象的模式,它保证一个类只有一个实例。 如上图所示,多线程情况下,在时刻T,线程A和线程B都判断single为null,从而进入if代码块中都执行了new Single()的操作创建了两个对象,就和我们当初的单例初衷相悖而行。 1、第一次判空目的:为了缩

    2024年02月15日
    浏览(40)
  • Spring的生命周期及Spring Bean单例和多例---超详细教学

        一个Bean对象从被Spring 容器创建到被销毁的整个过程 。Spring框架对Bean对象的生命周期进行了管理,提供了灵活性和控制权,让开发人员能够在不同的阶段进行自定义操作 1.2.1 定位和解决问题      对象的生命周期可以帮助我们 准确定位和解决程序中的问题 。当程序出现

    2024年02月11日
    浏览(28)
  • Spring中Bean的生命周期以及Bean的单例与多例模式

    bean的生命周期可以表达为:bean的定义➡bean的初始化➡bean的使用➡bean的销毁 1)通过XML、Java annotation(注解)以及Java Configuration(配置类) 等方式加载Bean 2)BeanDefinitionReader:解析Bean的定义。在Spring容器启动过程中, 会将Bean解析成Spring内部的BeanDefinition结构; 理解为:将

    2024年02月12日
    浏览(23)
  • Java:SpringBoot给Controller添加统一路由前缀

    网上的文章五花八门,不写SpringBoot的版本号,导致代码拿来主义不好使了。 本文采用的版本 访问地址:http://localhost:8080/api/index application.yml 访问地址:http://localhost:8080/prefix/api/index 注意:该方案会将所有的路由都增加一个前缀 注解 配置 使用注解 访问地址:http://localhost:

    2024年02月03日
    浏览(26)
  • Service 层异常抛到 Controller 层处理还是直接处理?

    一般初学者学习编码和[错误处理]时,先知道[编程语言]有一种处理错误的形式或约定(如Java就抛异常),然后就开始用这些工具。但却忽视这问题本质: 处理错误是为了写正确程序 。可是 由解决的问题决定的。问题不同,解决方案不同。 如一个web接口接受用户请求,参数

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包