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

@Primary注解在@Configuration类中对子类实例化无效问题求助

问题分析与解决方案

你的核心问题出在两个@Bean方法同名(都是createA)。Spring默认将@Bean方法名作为bean的唯一标识符,当存在同类型同名的bean定义时,后加载的配置类会直接覆盖先加载的,此时@Primary注解根本没有发挥作用的场景——因为Spring已经只保留了一个bean实例,不存在多个候选bean让@Primary指定优先级。

另外要注意:必须通过Spring依赖注入获取实例,不能自己直接new对象,否则所有配置都不会生效。

解决方案1:修改@Bean方法名称(推荐)

把两个@Bean方法改成不同名称,让Spring识别出两个独立的bean,此时@Primary就能正确指定优先注入的实例:

MainConfig.java

@Configuration
public class MainConfig {

    @Bean
    @Primary
    public A createBAsA() { // 修改方法名,避免冲突
        return new B();
    }

}

SampleConfig.java

@Configuration
public class SampleConfig {

    @Bean
    public A createA() { // 保留原方法名
        return new A();
    }
}

解决方案2:为@Bean指定自定义bean名称

如果不想修改方法名,可以通过@Bean的name属性为bean指定不同标识:

MainConfig.java

@Configuration
public class MainConfig {

    @Bean(name = "primaryBeanA")
    @Primary
    public A createA() {
        return new B();
    }

}

验证配置是否生效

在需要使用实例的类中,通过依赖注入获取对象并调用init():

@Autowired
private A a;

public void testInitMethod() {
    System.out.println("当前实例类型:" + a.getClass().getName());
    a.init();
}

运行后如果输出当前实例类型:com.yourpackage.B和Inside init method of B,就说明配置已经生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:48:24