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

sma*_*ufo 13 spring

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

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

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

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

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

  3. 如果bean名称可以自动分配给类的完整类名,那就太棒了.

有任何想法吗 ?谢谢.(春天3)

Mic*_*man 16

在您的配置中的某个位置,您已启用类路径扫描,可能正在使用

<context:component-scan>
Run Code Online (Sandbox Code Playgroud)

您可以指定一个名为的属性name-generator,该属性采用实现该BeanNameGenerator接口的bean .创建您自己的该接口实现并提供它的引用.


Fra*_*ang 6

这是因为它使用了AnnotationBeanNameGenerator简单地将非限定名称(类名称)作为bean名称,从而导致了冲突。

\n\n

解决这个问题的两个步骤:

\n\n

1\xe3\x80\x81您可以实现自己的bean名称生成策略,它使用完全限定名称(包+类名称),如下所示

\n\n
public class UniqueNameGenerator extends AnnotationBeanNameGenerator {\n    @Override\n    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {\n        //use fully-qualified name as beanName\n        String beanName = definition.getBeanClassName();\n        return beanName;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

2\xe3\x80\x81@ComponentScan(nameGenerator = UniqueNameGenerator.class)如果使用SpringBoot则添加到配置或Boot类中

\n\n
@Configuration\n@ComponentScan(nameGenerator = UniqueNameGenerator.class)\npublic class Config {\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 在较新版本的 Spring 中,您无需编写自己的实现,只需使用“FullyQualifiedAnnotationBeanNameGenerator”即可,它执行完全相同的操作。 (5认同)