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