自动分配spring的bean名称以防止名称冲突?

时间:2011-03-24 02:50:23

标签: spring

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

  

注释指定的bean名称   bean的'mybean'   [foobar.package1.mybean]冲突   与现有的,不兼容的bean   同名和类的定义   [foobar.package2.mybean]

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

  1. 程序员可以在他的包中任意命名他们的bean className,无论名称是否与其他包(程序员)冲突。所以程序员不需要大叫'嘿,我将使用bean名称XXXXX,不要与我发生冲突'。

  2. 没有手动XML bean名称分配。

  3. 如果bean名称可以自动分配给类的完整类名,那就太棒了。
  4. 有什么想法吗?谢谢。 (春天3)

2 个答案:

答案 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 {
}