解决springboot生成bean名称冲突(AnnotationBeanNameGenerator)
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对象都是独特的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341