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

