信息发布→ 登录 注册 退出

解决springboot生成bean名称冲突(AnnotationBeanNameGenerator)

发布时间:2026-01-11

点击量:
目录
  • springboot生成bean名称冲突
    • 问题描述
    • 解决问题
  • 自定义bean对象重名问题

    springboot生成bean名称冲突

    问题描述

    我们再使用springboot的时候,在不同的文件目录下,可能存在相同名称的java类,这个时候会报bean name冲突错误

    首先我们来了解下,springboot生成bean名称的原理

    当Component,Respository,Service,Controller注解的value树形没有自定义时,会根据类的名称生成一个短的bean name。例如: com.xyz.FooServiceImpl -> fooServiceImpl

    也就是说,会忽略路径,生成首字母小写的bean name,所以,上面哪种情况会导致冲突

    但是由于我们平时编码的习惯,几乎避免了这个重名文件的存在,所以,没遇到过这个错误

    解决问题

    使用自定义AnnotationBeanNameGenerator

    @SpringBootApplication
    @RestController
    @ComponentScan(nameGenerator = DatabasesApplication.SpringBeanNameGenerator.class)
    public class DatabasesApplication {
        public static class SpringBeanNameGenerator extends AnnotationBeanNameGenerator {
            @Override
            protected String buildDefaultBeanName(BeanDefinition definition) {
                return definition.getBeanClassName();
            }
        }
        public static void main(String[] args) {
            SpringApplication.run(DatabasesApplication.class, args);
        }
        @GetMapping("/hello")
        public String hello(){
            return "hello databases!";
        }
    }
    

    我是在做springboot实现多数据源时还有个其他地方使用

    MapperScan注解中使用

    @MapperScan(basePackages = "com.databases.databases.dao.one", sqlSessionFactoryRef = "oneSqlSessionFactory",nameGenerator = DatabasesApplication.SpringBeanNameGenerator.class)
    

    自定义bean对象重名问题

    在已经有对象的情况下,设置bean加载的时候注意不要重名

    不然启动不了,会给你提示在配置文件中添加spring.main.allow-bean-definition-overriding=true  这个东西的意思是当有重名bean的时候覆盖上一个,不建议使用,毕竟每个bean对象都是独特的

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!