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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章