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

构造函数指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:20:55