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
相关产品推荐
相关产品推荐

