我有一个应用程序初始化程序类,用于将特定于应用程序的数据插入数据库。
@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]
为什么@Primary
当bean有名字时注释不被尊重?我需要他们拥有一个,因为我在其他地方确保初始化程序已经用@DependsOn("applicationInitializer")
注释实例化。