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"; }
问题原因及修复方案
Bean名称冲突
Config1和Config2都定义了名为DATA_FILLER的String类型Bean,Spring容器不允许同类型同名称的Bean共存,这会导致Bean初始化异常,直接影响后续的依赖注入。修复:给两个
StringBean设置唯一名称,并同步修改@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); } }
- 修改
逻辑错误修正
Config2的tractorInfo方法中,创建CarsInfo时错误传入了IDs.CAR_ID,应改为IDs.TRACTOR_ID(已在上面的修复代码中修正)。确保配置类被扫描
确认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
相关产品推荐
相关产品推荐

