构造函数指定Bean仍触发Spring多Bean实例错误,求助解决
解决Spring多Bean实例错误(无需@Primary/@Qualifier)
问题根源
你给demoController标注了@RestController,Spring会自动扫描并创建这个类的Bean;同时该类构造函数上的@Autowired会触发Spring自动注入Coach实例,但此时容器里存在FootballCoach和CricketCoach两个Coach实现类的Bean,因此触发多实例冲突。你在配置类里手动创建的demoControllerBean,和Spring自动生成的Bean形成了双重定义,这就是报错的核心原因。
解决方案
去掉demoController上的@RestController和构造函数的@Autowired注解,让Spring完全通过你配置类里的逻辑来创建demoControllerBean,避免自动注入的冲突。
修改后的demoController代码
package com.example.Spring2.interafaces; import org.springframework.web.bind.annotation.GetMapping; // 移除@RestController注解 public class demoController { private Coach myCoach; // 移除@Autowired注解 public demoController(Coach myCoach){ this.myCoach = myCoach; } @GetMapping("/demo") public String demo(){ return myCoach.dailyWorkout(); } }
配置类代码保持不变
package com.example.Spring2.interafaces; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public Coach setFcoach(){ return new FootballCoach(); } @Bean public Coach setCricketCoach(){ return new CricketCoach(); } @Bean public demoController setDemoController(){ return new demoController(setFcoach()); } }
原理说明
移除@RestController后,Spring不会自动扫描创建demoController的Bean,而是完全依赖你在AppConfig里的setDemoController()方法来实例化,该方法明确传入了setFcoach()返回的FootballCoach实例,不存在自动注入时的多Bean匹配问题。同时,@GetMapping注解依然会被Spring识别,保证接口可以正常访问。
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

