Spring 自动分配弹簧&x27;如何设置bean名称以防止名称冲突?

Spring 自动分配弹簧&x27;如何设置bean名称以防止名称冲突?,spring,Spring,在spring应用程序中,如果两个程序员开发两个包,将@Repository注释为相同的类名,spring将抛出“IllegalStateException”: 注释指定的bean名称 用于bean类的“mybean” [foobar.package1.mybean]冲突 使用现有的、不兼容的bean 相同名称和类的定义 [foobar.package2.mybean] 一种解决方案是在@Repository中添加额外的值,例如@Repository(“package1.mybean”)和@Re

在spring应用程序中,如果两个程序员开发两个包,将@Repository注释为相同的类名,spring将抛出“IllegalStateException”:

注释指定的bean名称 用于bean类的“mybean” [foobar.package1.mybean]冲突 使用现有的、不兼容的bean 相同名称和类的定义 [foobar.package2.mybean]

一种解决方案是在@Repository中添加额外的值,例如
@Repository(“package1.mybean”)
@Repository(“package2.mybean”)
,但我正在寻找一种更有效的解决方案,可以自动缓解这种情况。我希望解决方案能够实现以下目标:

  • 程序员可以在他的包中任意命名他们的bean类名,而不管名称是否与其他包(程序员)冲突。所以程序员不需要喊‘嘿,我要用bean名XXXXX,不要和我冲突’

  • 没有手动分配XML bean名称

  • 如果bean名称可以自动分配给类的完整类名,那就太好了
  • 有什么想法吗?谢谢
    (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
    即可,它的作用完全相同。