【问题标题】:Automatically assign spring's bean name to prevent name conflicts?自动分配spring的bean名称防止名称冲突?
【发布时间】:2011-03-24 02:50:22
【问题描述】:

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

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

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

  1. 程序员可以在他的包中任意命名他们的bean className,而不管名称是否与其他包(程序员)冲突。这样程序员就不需要大喊‘嘿,我要使用 bean name XXXXX,不要和我冲突’。

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

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

有什么想法吗?谢谢。 (春季 3)

【问题讨论】:

    标签: spring


    【解决方案1】:

    在您的配置中,您启用了类路径扫描,可能正在使用

    <context:component-scan>
    

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

    【讨论】:

    • 谢谢,这正是我需要的!
    • 这是我一个名为 bean 名称生成器的包的简单实现: public class PackageBeanNameGenerator implements BeanNameGenerator { public String generateBeanName(BeanDefinition 定义,BeanDefinitionRegistry 注册表) { String beanClassName = Introspector.decapitalize(definition.getBeanClassName() ); logger.debug("实例化 bean 名称:" + beanClassName);返回豆类名称; } }
    【解决方案2】:

    这是因为它使用AnnotationBeanNameGenerator,只是将non-qualified name(class name)作为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,请在配置或Boot类中添加@ComponentScan(nameGenerator = UniqueNameGenerator.class)

    @Configuration
    @ComponentScan(nameGenerator = UniqueNameGenerator.class)
    public class Config {
    }
    

    【讨论】:

    • 在较新版本的 Spring 中,您无需编写自己的实现,只需使用 FullyQualifiedAnnotationBeanNameGenerator 即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多