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

Spring Boot单例作用域Bean每次请求返回不同hashCode问题求助

问题原因及解决方案

问题根源

你在请求处理方法impl1的参数上同时使用@Autowired和@Qualifier是错误用法。Spring MVC的请求处理方法参数用于绑定请求参数、路径变量、请求体等内容,并非用来注入Spring容器中的Bean。这种错误用法会导致Spring每次处理请求时,都错误地创建新的Implementation1实例,从而出现hashCode每次都不同的情况。

解决方案

将Implementation1的依赖注入到控制器的成员字段或构造方法中,而非请求处理方法的参数上。以下是两种正确实现方式:

方式1:构造方法注入(推荐)

@RestController
public class HomeController {

    private final Implementation1 impl;

    // 通过构造方法注入单例Bean
    public HomeController(@Qualifier("impl1") Implementation1 impl) {
        this.impl = impl;
    }

    @GetMapping("/impl1")
    public String impl1() {
        return impl.process() + " " + impl.hashCode();
    }
}

方式2:字段注入

@RestController
public class HomeController {

    @Autowired
    @Qualifier("impl1")
    private Implementation1 impl;

    @GetMapping("/impl1")
    public String impl1() {
        return impl.process() + " " + impl.hashCode();
    }
}

原理说明

Spring Boot中默认Bean的作用域确实是单例,但只有通过Spring规范的依赖注入方式(构造方法、字段、Setter方法注入)获取的Bean,才会复用容器中的单例实例。控制器本身也是单例Bean,一旦它持有了单例的Implementation1实例,每次请求都会复用同一个Bean,hashCode自然保持一致。

内容的提问来源于stack exchange,提问作者Piyush Lovanshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:04