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

Spring自动填充配置问题:@Autowired注入Map未触发填充

问题

项目编译正常且服务器已启动,但Spring配置未触发执行,AppManager类中的Map<String, CarsInfo>无法自动填充。

相关代码

主类 MainApplication

@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MainApplication.class);
        app.setDefaultProperties(Collections
                .singletonMap("server.port", "8083"));
        app.run(args);
    }
}

待注入类 AppManager

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AppManager {

    private final Map<String, CarsInfo> carsInfos;

    @Autowired
    public AppManager(Map<String, CarsInfo> carsInfos) {
        this.carsInfos = carsInfos;
    }
}

实体类 CarsInfo

public class CarsInfo {
    private String id;
    private String data;

    public CarsInfo(String id, String data) {
        this.id = id;
        this.data = data;
    }
}

配置类 Config1

@Configuration
public class Config1 {

    @Bean("DATA_FILLER")
    public String getData() {
        return "Car Test";
    }

    @Bean(IDs.CAR_ID)
    public CarsInfo carInfo(@Qualifier("DATA_FILLER") String data) {
        return new CarsInfo(IDs.CAR_ID, data);
    }
}

配置类 Config2

@Configuration
public class Config2 {
    @Bean("DATA_FILLER")
    public String getData() {
        return "Tractor Test";
    }

    @Bean(IDs.TRACTOR_ID)
    public CarsInfo tractorInfo(@Qualifier("DATA_FILLER") String data) {
        return new CarsInfo(IDs.CAR_ID, data);
    }
}

常量类 IDs

public class IDs {
    public static final String CAR_ID = "car_id";
    public static final String TRACTOR_ID = "tractor_id";
}

问题原因及修复方案

  1. Bean名称冲突
    Config1和Config2都定义了名为DATA_FILLER的String类型Bean,Spring容器不允许同类型同名称的Bean共存,这会导致Bean初始化异常,直接影响后续的依赖注入。

    修复:给两个String Bean设置唯一名称,并同步修改@Qualifier的引用:

    • 修改Config1:
      @Configuration
      public class Config1 {
      
          @Bean("CAR_DATA_FILLER")
          public String getData() {
              return "Car Test";
          }
      
          @Bean(IDs.CAR_ID)
          public CarsInfo carInfo(@Qualifier("CAR_DATA_FILLER") String data) {
              return new CarsInfo(IDs.CAR_ID, data);
          }
      }
      
    • 修改Config2:
      @Configuration
      public class Config2 {
          @Bean("TRACTOR_DATA_FILLER")
          public String getData() {
              return "Tractor Test";
          }
      
          @Bean(IDs.TRACTOR_ID)
          public CarsInfo tractorInfo(@Qualifier("TRACTOR_DATA_FILLER") String data) {
              return new CarsInfo(IDs.TRACTOR_ID, data);
          }
      }
      
  2. 逻辑错误修正
    Config2的tractorInfo方法中,创建CarsInfo时错误传入了IDs.CAR_ID,应改为IDs.TRACTOR_ID(已在上面的修复代码中修正)。

  3. 确保配置类被扫描
    确认Config1、Config2所在包在@SpringBootApplication的默认扫描范围内(主类所在包及其子包),若不在,需添加@ComponentScan指定扫描路径:

    @SpringBootApplication(scanBasePackages = "com.your.package.path")
    public class MainApplication {
        // ...
    }
    

验证

修复后,Spring容器启动时会自动收集所有CarsInfo类型的Bean,将Bean名称(即@Bean指定的CAR_ID和TRACTOR_ID)作为Key,Bean实例作为Value,填充到AppManager的Map<String, CarsInfo>中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:00:56