@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
相关产品推荐
相关产品推荐

