← 返回文章列表

backend项目架构设计 - 全局Bean名称生成器

分类:计算机/架构/backend项目架构设计

一个软件项目中经常存在名称相同但意义不同的类,例如实施领域和研发领域都有“项目”这个实体,也就都有ProjectMapperProjectServiceProjectController等类。

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)