尽管使用了@Primary,但两个具有相同名称的bean会导致ConflictingBeanDefinitionException

我有一个应用程序初始化程序类,用于将特定于应用程序的数据插入数据库。

@Component("applicationInitializer") public class ApplicationInitializer { @PostConstruct public void init(){ // some clever code here } } 

还有DevApplicationInitializer类,用于在开发人员计算机上使用一些示例数据初始化数据库(在部署生产代码时排除此类)。

 @Component("applicationInitializer") @Primary public class DevApplicationInitializer extends ApplicationInitializer { @PostConstruct @Override public void init(){ super.init(); // even more clever code here } } 

直到我给bean命名(只有@Component注释) – 一切正常 – 当DevApplicationInitializer可用时,它被实例化而不是ApplicationInitializer 。 当我给他们一个applicationInitializer名称时,抛出了exception:

 org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'applicationInitializer' for bean class [com.example.DevApplicationInitializer] conflicts with existing, non-compatible bean definition of same name and class [com.example.ApplicationInitializer] 

当bean有名称时,为什么不遵守@Primary注释? 我需要它们有一个,因为我在其他地方确保初始化器已经使用@DependsOn("applicationInitializer")注释进行了实例化。

@Primary与bean名称@Primary 。 javadoc说

表示当多个候选者有资格自动assembly单值依赖项时,应该优先考虑bean。

这仅适用于包含两个类型A的bean的上下文,其中类型B的bean需要注入A 使用@Primary注释的A bean将具有优先权。

给定类型的Bean ID /名称必须是唯一的。 (具有相同名称的Bean定义可以为相同的bean类型相互覆盖。例如,如果组件扫描了使用@Component注释的@Component但同时为该类型提供了@Bean方法,则会发生这种情况。)