springboot项目不同package下拥有相同命名的class,导致启动报错的解决方法

  1. 错误的原因

    spring的源码中注册bean之前,会对bean的name做一个判断,如果bean的name是重复的,spring则会报错误,所以我们如果想不让spring报错,则需要让生成的bean的name为“package+name”这种形式。我们继续看,生成bean的name的方法为

    beanNameGenerator.generateBeanName(candidate, this.registry);
    

    此方法有两个实现类

    DefaultBeanNameGenerator
    AnnotationBeanNameGenerator
    

    这两个实现类就决定了生成的bean的name是“name”or“package+name”的命名方式。

    详细信息可以看⬇
    https://www.jianshu.com/p/a4ae1baf5015

  2. 解决方法

    spring默认的使用实现方法是“AnnotationBeanNameGenerator”,所以生成的bean的name是不加package的;
    我们要做的就是让spring去实现“DefaultBeanNameGenerator”从而生成的bean的name为“package+name” ;
    这个时候我们就需要手动写一个实现类去实现“DefaultBeanNameGenerator”,然后让启动类去扫描这个实现类,从而让实现类起作用生成bean的name为“package+name”。

    public class UniqueNameGenerator extends AnnotationBeanNameGenerator {
          
          
    
        @Override
        public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
          
          
            //全限定类名
            String beanName = definition.getBeanClassName();
            return beanName;
        }
    }
    

    然后在启动类上加上启动扫描

    @SpringBootApplication
    @ComponentScan(nameGenerator = UniqueNameGenerator.class)
    public class MedicalServerApplication {
          
          
    
        public static void main(String[] args) {
          
          
            SpringApplication.run(MedicalServerApplication.class, args);
        }
    }
    

    然后便可以启动不报错

    详细信息可以看⬇
    https://www.cnblogs.com/bedlimate/p/8660839.html

猜你喜欢

转载自blog.csdn.net/weixin_45121502/article/details/105703025