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

时间:2014-06-05 17:23:48

标签: java spring inversion-of-control spring-ioc

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

@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名称时,会抛出异常:

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")注释进行了实例化。

1 个答案:

答案 0 :(得分:3)

@Primary与bean名称无关。 javadoc陈述

  

表示在多个bean时应该优先考虑bean   候选人有资格自动使用单值依赖。

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

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