一个软件项目中经常存在名称相同但意义不同的类,例如实施领域和研发领域都有“项目”这个实体,也就都有ProjectMapper、ProjectService、ProjectController等类。
Spring Boot默认将类名转为小写驼峰形式作为Bean名称,这就导致出现相同的Bean名称,Spring Boot报错。
解决办法:编写GlobalBeanNameGenerator类,对于单例Bean(绝大多数情况),将Bean名称自动设置为类的完全限定名,确保唯一。然后在@SpringBootApplication、@MapperScan中使用GlobalBeanNameGenerator。
参考代码:
public class GlobalBeanNameGenerator extends AnnotationBeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
// 如果是单例,且能获取到bean的类名
if (definition.isSingleton() && definition.getBeanClassName() != null) {
// 返回类的完全限定名作为bean的名称,此时不同包的同名类会生成不同的bean名称
return definition.getBeanClassName();
}
// 其他情况,保持原有的生成名称的逻辑
return super.generateBeanName(definition, registry);
}
}
@SpringBootApplication(nameGenerator = GlobalBeanNameGenerator.class)
@MapperScan(nameGenerator = GlobalBeanNameGenerator.class)