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

发布时间 2023-10-03 10:59:10作者: 斌哥的小弟

前言:

 在笔者刚刚接触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";
    }
}