You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Singleton作用域Bean行为疑问:成员变量未更新

Spring Boot @RestController成员变量始终为null的原因分析

你的代码逻辑本身符合单例Bean的特性,但出现previousFruitName始终为null的现象,大概率是以下几种情况导致:

  • Bean实例被重复创建:@RestController默认是单例作用域,但如果存在以下场景,会导致每次请求都生成新的Class1实例:

    • 代码中手动new Class1()创建了实例,而非依赖Spring容器注入
    • 类上被错误添加了@Scope("prototype")注解,强制每次请求生成新实例
    • 项目组件扫描配置重复,导致Spring容器中存在多个Class1实例
      可以给Class1添加构造方法打印实例信息,验证是否每次请求都新建了对象:
    public Class1() {
        System.out.println("Class1实例创建:" + this);
    }
    

    如果每次请求输出的对象哈希值不同,就说明是多实例问题。

  • 请求分发到了不同服务实例:如果本地启动了多个Spring Boot服务实例(比如不同端口),或者部署环境用了负载均衡,请求会被分发到不同的服务实例上。每个实例的previousFruitName是独立的,交叉请求就会看到变量始终为初始的null。检查请求的目标端口,确保所有请求都发往同一个服务实例。

  • 变量被意外重置:排查是否有其他代码(比如AOP切面、其他未注意到的方法)修改了previousFruitName的值,将其重置为null。可以给变量添加setter方法并打印日志,追踪变量的修改记录:

    public void setPreviousFruitName(String previousFruitName) {
        System.out.println("修改previousFruitName:" + this.previousFruitName + " -> " + previousFruitName);
        this.previousFruitName = previousFruitName;
    }
    

    替换原代码中直接赋值的逻辑,用setter方法修改变量,查看日志是否有异常的重置操作。


内容的提问来源于stack exchange,提问作者Alok Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:38:08