编程语言
首页 > 编程语言> > java-尽管使用@Primary,但两个具有相同名称的bean仍会导致ConflictingBeanDefinitionException

java-尽管使用@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名称时,抛出了异常:

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名称无关. Javadoc状态

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

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

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

标签:spring-ioc,spring,java,inversion-of-control
来源: https://codeday.me/bug/20191121/2053396.html