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

多模块Maven项目中继承父@Configuration的子类配置导致父类Bean未实例化问题

多模块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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:19:41