多模块Maven项目中继承父@Configuration的子类配置导致父类Bean未实例化问题
我太懂你踩的这个坑了!这其实是Spring处理@Configuration继承逻辑时很容易忽略的细节,核心问题出在**@Bean方法的名字冲突**上——注意,是方法本身的名字,不是你给@Bean指定的name属性!
问题根源
Spring对标注了@Configuration的类会生成CGLIB代理,用来管控Bean的创建流程。当你的AaConfig继承CommonConfig后,两个类里恰好都有一个叫getModelMapper的@Bean方法,这时候子类的方法会直接覆盖父类的同名方法——哪怕你给两个@Bean指定了不同的name(父类是commonMapper,子类是aMapper)也没用。
这就导致Spring初始化时,只会执行子类AaConfig里的getModelMapper方法,父类CommonConfig中的同名方法完全不会被调用,自然commonMapper这个Bean根本没机会被创建,最终就出现了你看到的NoSuchBeanDefinitionException——SomeClass要注入的commonMapperBean压根不存在。
解决方案
最直接稳妥的办法就是让父类和子类的@Bean方法名彻底区分开,避免方法覆盖:
1. 修改父类CommonConfig的@Bean方法
@Configuration public class CommonConfig { @Bean(name = "commonMapper") // 把方法名改成和子类不一样的getCommonModelMapper public ModelMapper getCommonModelMapper() { System.out.println("getModelMapper Common"); return new ModelMapper(); } }
2. 修改子类AaConfig的@Bean方法
@Configuration public class AaConfig extends CommonConfig { @Bean(name = "aMapper") // 方法名改成getAModelMapper,和父类的方法名彻底划清界限 public ModelMapper getAModelMapper() { System.out.println("getModelMapper AAAAAAAAAAAA"); ModelMapper modelMapper = new ModelMapper(); return modelMapper; } }
这么改完之后,Spring会分别识别父类和子类的两个@Bean方法,顺利创建commonMapper和aMapper两个独立的Bean,SomeClass里通过@Qualifier("commonMapper")注入的Bean也能正常被找到并初始化了。
额外说明
你之前打破继承关系后两个Bean都能正常工作,本质就是因为没有了子类对父类方法的覆盖,Spring会分别处理两个独立@Configuration类中的Bean定义逻辑。
内容来源于stack exchange

