如何将Spring XML配置改写为保留依赖关系的Java配置
Spring XML配置转Java配置完整实现方案
核心问题解决思路
你遇到的No bean 'A' available报错,核心原因有两个:
@Configuration类默认的Bean名称是类名首字母小写(即configurationA),和XML中定义的id="A"不匹配- 依赖声明方式错误,没有正确对应XML的
depends-on属性
分步实现代码
1. 修正配置类的Bean名称和依赖声明
首先调整三个原有配置类的注解:
// 显式指定配置类的Bean名称为A,对应XML中的id="A" @Configuration("A") @Import({ConfigA.class, ConfigB.class}) public class ConfigurationA { @Bean public ABC abc() { return new ABC(); } // 保留原有其他配置逻辑 }
// 无id的配置类保持默认即可 @Configuration public class ConfigurationB { // 保留原有objectFromConfigurationB的Bean定义 @Bean public Object objectFromConfigurationB() { return new Object(); } // 保留原有其他配置逻辑 }
// 用@DependsOn注解对应XML的depends-on属性 @Configuration @DependsOn("objectFromConfigurationB") public class ConfigurationC { // 保留原有其他配置逻辑 }
2. 统一注册配置类(避免扫包漏配)
推荐使用显式导入的方式注册所有配置类,和XML的显式Bean声明逻辑完全一致,不会出现扫包漏配的问题:
@Configuration @Import({ConfigurationA.class, ConfigurationB.class, ConfigurationC.class}) public class RootAppConfig { // 全局其他公共Bean定义可以写在这里 }
如果你更习惯和XML完全对齐的注册方式,也可以直接在总配置类中把配置类作为Bean注册:
@Configuration public class RootAppConfig { @Bean(name = "A") public ConfigurationA configurationA() { return new ConfigurationA(); } @Bean public ConfigurationB configurationB() { return new ConfigurationB(); } @Bean @DependsOn("objectFromConfigurationB") public ConfigurationC configurationC() { return new ConfigurationC(); } }
报错排查要点
如果仍然出现No bean 'A' available错误,按以下顺序排查:
- 检查启动类/上下文注册的总配置类是否正确包含了
ConfigurationA - 检查
ConfigurationA的@Configuration注解是否显式指定了value="A" - 检查所有配置类的包路径是否正确,没有被
excludeFilters过滤掉
内容的提问来源于stack exchange,提问作者Wojciech Szymski
相关产品推荐
相关产品推荐

