Spring 自动分配弹簧&x27;如何设置bean名称以防止名称冲突?
在spring应用程序中,如果两个程序员开发两个包,将@Repository注释为相同的类名,spring将抛出“IllegalStateException”: 注释指定的bean名称 用于bean类的“mybean” [foobar.package1.mybean]冲突 使用现有的、不兼容的bean 相同名称和类的定义 [foobar.package2.mybean] 一种解决方案是在@Repository中添加额外的值,例如Spring 自动分配弹簧&x27;如何设置bean名称以防止名称冲突?,spring,Spring,在spring应用程序中,如果两个程序员开发两个包,将@Repository注释为相同的类名,spring将抛出“IllegalStateException”: 注释指定的bean名称 用于bean类的“mybean” [foobar.package1.mybean]冲突 使用现有的、不兼容的bean 相同名称和类的定义 [foobar.package2.mybean] 一种解决方案是在@Repository中添加额外的值,例如@Repository(“package1.mybean”)和@Re
@Repository(“package1.mybean”)
和@Repository(“package2.mybean”)
,但我正在寻找一种更有效的解决方案,可以自动缓解这种情况。我希望解决方案能够实现以下目标:
(Spring 3)在配置的某个地方,您启用了类路径扫描,可能是使用
<context:component-scan>
您可以指定名为
name generator
的属性,该属性接受实现beannamagenerator
接口的bean。创建您自己的接口实现并提供对它的引用。这是因为它使用了注释BeanNameGenerator
,它只是将非限定名(类名)作为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 {
}
谢谢,这正是我需要的!下面是名为bean name generator的包的简单实现:公共类PackageBeanNameGenerator实现BeanNameGenerator{public String generateBeanName(BeanDefinition定义,BeanDefinitionRegistry注册表){String beanClassName=Introspector.decapitalize(definition.getBeanClassName());logger.debug(在较新版本的Spring中,实例化名为“+beanClassName;”的bean;返回beanClassName;}}}}}的bean,而不是编写自己的实现,您只需使用
FullyQualifiedNotationBeanNameGenerator
即可,它的作用完全相同。