在spring应用程序中,如果两个程序员开发了两个包,将@Repository注释为相同的类名,Spring将抛出"IllegalStateException":
bean类[foobar.package1.mybean]的注释指定bean名称'mybean'与同名和类[foobar.package2.mybean]的现有非兼容bean定义冲突
一种解决方案是在@Repository中添加额外的值,例如@Repository("package1.mybean")和@Repository("package2.mybean"),但我正在寻找一种更有效的解决方案,可以自动缓解这种情况.我希望解决方案能够实现这些目标:
程序员可以在他的包中任意命名他们的bean className,无论名称是否与其他包(程序员)冲突.所以程序员不需要大叫'嘿,我将使用bean名称XXXXX,不要与我发生冲突'.
没有手动XML bean名称分配.
有任何想法吗 ?谢谢.(春天3)
Mic*_*man 16
在您的配置中的某个位置,您已启用类路径扫描,可能正在使用
<context:component-scan>
Run Code Online (Sandbox Code Playgroud)
您可以指定一个名为的属性name-generator,该属性采用实现该BeanNameGenerator接口的bean .创建您自己的该接口实现并提供它的引用.
这是因为它使用了AnnotationBeanNameGenerator简单地将非限定名称(类名称)作为bean名称,从而导致了冲突。
解决这个问题的两个步骤:
\n\n1\xe3\x80\x81您可以实现自己的bean名称生成策略,它使用完全限定名称(包+类名称),如下所示
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n2\xe3\x80\x81@ComponentScan(nameGenerator = UniqueNameGenerator.class)如果使用SpringBoot则添加到配置或Boot类中
@Configuration\n@ComponentScan(nameGenerator = UniqueNameGenerator.class)\npublic class Config {\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6471 次 |
| 最近记录: |