java - 尽管使用 @Primary,但两个同名的 bean 会导致 ConflictingBeanDefinitionException

标签 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 名称时,抛出了异常:

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]

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

最佳答案

@Primary 与 bean 名称无关。 javadoc 状态

Indicates that a bean should be given preference when multiple candidates are qualified to autowire a single-valued dependency.

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

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

关于java - 尽管使用 @Primary,但两个同名的 bean 会导致 ConflictingBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066425/

相关文章:

java - 同步和@Transactional 让我困惑

java - trello oauth 未能将我重定向到 oauth_callback,并保持将我重定向到 oob

java - 清除现有图表并添加新数据

java - 如何为程序创建下载链接

java - DOCX4J:如何向 docx 模板中的现有表添加行?

spring - @ComponentScanning-Error 在 Spring Boot 应用程序中使用 IntelliJ 而不是 Eclipse

spring - Hibernate命名策略

c# - 这是控制反转的例子吗?

asp.net-mvc - 使用依赖注入(inject)组织 ASP.Net MVC 解决方案的最佳方法是什么?

spring - 服务之外的 Grails 依赖注入(inject)?