首页 > 其他分享 >为什么不要在控制层中定义成员变量?

为什么不要在控制层中定义成员变量?

时间:2023-10-03 11:00:59浏览次数:27  
标签:count 变量 层中 成员 hello 定义

前言:

 在笔者刚刚接触web开发的初期,非常喜欢将一些成员变量定义在控制层中,然后就在控制层中进行一些简单的业务逻辑处理,再返回给前端,因为这样的方式简单快捷,并且由于业务逻辑非常简单,比如需要统计两个部门的人数总和,就会先获取第一个部门的人数总和,然后用一个成员变量int sum1表示,再获取另一个部门的人数总和,用成员变量sum2表示,再用 int sum3 = sum1 + sum2,最后 return sum3;

 

问题:

  众所周知,@Controller的bean的作用域是singleton的,也就是说在整个ioc容器当中只有一个实例,控制层通常是多线程环境下的,多个请求可能同时操作同一个控制器实例。如果在控制层中定义成员变量,则多个请求会共享这些成员变量,可能导致数据混乱或不一致性。

  另外在控制层中定义成员变量可能会导致对内存的占用增加。因为每个请求都会创建一个控制器实例,如果在控制层中定义了成员变量,那么每个实例都会占用额外的内存空间来存储这些成员变量,从而增加了内存的使用量。

  最后,如果业务变更,需求变得更加复杂,需要的变量也会增多,那么到时候代码的可读性将会变得很低,并且可能会导致数据在不同方法之间传递和共享,增加了程序的复杂性和bug的可能性。

 

解决方法:

  最简单的解决方法就是换成局部变量,比如:

@Controller
public class MyController {
    private int count = 0;

    @RequestMapping("/hello")
    public String hello(Model model) {
        count++;
        model.addAttribute("count", count);
        return "hello";
    }
}

count就有并发问题,改成:

@Controller
public class MyController {
    @RequestMapping("/hello")
    public String hello(Model model) {
        int count = 0; // 在方法内部定义局部变量
        count++;
        model.addAttribute("count", count);
        return "hello";
    }
}

 

标签:count,变量,层中,成员,hello,定义
From: https://www.cnblogs.com/xialang/p/17740890.html

相关文章

  • 6.1字典的定义
    None什么都不是80 是设置了一个值 ......
  • Shell 数组的定义与增删改查
    Shell数组介绍为什么会产生Shell数组?通常在开发Shell脚本时,定义变量采用的形式为“a=1;b=2;c=3”,可如果有多个变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生了,它就是为了解决......
  • Shell 函数详解(函数定义、函数调用、参数变量)
    Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。Shell中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。Shell函数定义的语法格式如下:functionname(){statements[re......
  • 3-13 字符串类型 字符串类型:str 1.定义格式: 变量 = '内容'
    3-13字符串类型字符串类型:str   1.定义格式:       变量='内容'           打印一行       变量="内容"           打印一行       变量='''内容'''或者三引号           可以通过回车的方式换行,......
  • springMVC自定义校验注解
     1.定义注解校验器PhoneNoValidator.java1/**2*@Authorhxy3*@Description4*@Date2023/9/1410:485*@Version1.06*/7publicclassPhoneNoValidatorimplementsConstraintValidator<PhoneNo,String>{8@Override9publicvo......
  • 笨办法学Python3 习题5 更多的变量和打印
    知识点:f是format格式化的意思,写法1: f "Hello,XXX{变量名1}XX{变量名2}XX" ,写法2:"Hello,XXX{}XX{}XX".format(变量名1,变量名2)浮点数四舍五入的方法,如1.2345,round(1.2345),使用的是round()函数 ......
  • 自定义数据类型和数据类型别名
    自定义数据类型和数据类型别名代码//example.gopackagetestimport"fmt"funcTestFunction(){ fmt.Println("自定义类型") //自定义类型mesType,它是uint16的别名 //注意:虽然mesType是uint16的别名,但是二者仍是不同类型,不能够 //相互赋值和比较,需要进行类型转换 //......
  • 笨办法学Python3 习题4 变量和命名
    知识点:变量名需要字母或下划线开头,由字母,下划线,数字组成,数字不能开头变量名不能有特殊符号,不能和关键字,保留字相同应尽量简洁,方便理解记忆变量名区分大小写myName和myname是不同的变量名需要遵循命名约定(网上补充)常见变量名约定:Pascal命名法,所有单词的首字母大写如......
  • 安装TD后Python模块中定义的类
    两个知识点 1,TD模块中定义的类可继承自外部,比如object2,模块不是类,其中可定义类。那么,如何查询该模块儿定义的继承自外部的类呢?特别是对于TD而言 A,TD中的类可用dir(略)可用inspect模块查询类 结果是['AbsTime','Actors','App','Attribute','AttributeData','Attrib......
  • 【TypeScript】一直提示 :无法重新声明块范围变量
    【TypeScript】一直提示:无法重新声明块范围变量问题描述:在VSCode中编写ts代码时,编写保存完之后,通过tsc文件名.ts编译就会看到变量名下面出现了红色的波浪线,提示的内容是无法重新声明块范围变量。解决方法:在终端只需要使用tsc--init生成tsconfig.json文件就可以解决了。或者在当......