Automatically assign spring's bean name to prevent name conflicts?

Somewhere in your config, you've enabled classpath scanning, probably using

<context:component-scan>

You can specify a property called name-generator, which takes a bean that implements the BeanNameGenerator interface. Create your own implementation of that interface and provide a reference to it.


This is because it is using AnnotationBeanNameGenerator which simply put non-qualified name(class name) as the bean name, then caused conflict.

Two steps to resolve this:

1、You can implement your own bean name generation strategy which use fully-qualified name (package + class name) like below

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、Add @ComponentScan(nameGenerator = UniqueNameGenerator.class) to configuration or Boot class if you are using SpringBoot

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

Tags:

Spring