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