在spring应用程序中,如果两个程序员开发了两个包,将@Repository注释为相同的类名,Spring将抛出“IllegalStateException”:
注释指定的bean名称 bean的'mybean' [foobar.package1.mybean]冲突 与现有的,不兼容的bean 同名和类的定义 [foobar.package2.mybean]
一种解决方案是在@Repository中添加额外的值,例如@Repository("package1.mybean")
和@Repository("package2.mybean")
,但我正在寻找一种更有效的解决方案,可以自动缓解这种情况。我希望解决方案能够实现这些目标:
程序员可以在他的包中任意命名他们的bean className,无论名称是否与其他包(程序员)冲突。所以程序员不需要大叫'嘿,我将使用bean名称XXXXX,不要与我发生冲突'。
没有手动XML bean名称分配。
有什么想法吗?谢谢。 (春天3)
答案 0 :(得分:16)
在配置中的某个位置,您已启用类路径扫描,可能使用
<context:component-scan>
您可以指定一个名为name-generator
的属性,该属性采用实现BeanNameGenerator
接口的bean。创建您自己的该接口实现并提供对它的引用。
答案 1 :(得分:0)
这是因为它使用AnnotationBeanNameGenerator
只是将非限定名称(类名)作为Bean名称,然后引起冲突。
解决此问题的两个步骤:
1,您可以实施自己的bean名称生成策略,该策略使用如下所示的完全限定的名称(包+类名)
public class UniqueNameGenerator extends AnnotationBeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
//use fully-qualified name as beanName
String beanName = definition.getBeanClassName();
return beanName;
}
}
2,如果使用SpringBoot,则将@ComponentScan(nameGenerator = UniqueNameGenerator.class)
添加到配置或引导类中
@Configuration
@ComponentScan(nameGenerator = UniqueNameGenerator.class)
public class Config {
}