我有一个应用程序初始化类,用于将特定于应用程序的数据插入数据库。
@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/