解决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对象都是独特的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringMVC HttpMessageConverter报文信息转换器
HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文。HttpMessageConverter提供了两个注解和两个类型:@RequestBody,@ResponseBody,RequestEntity,ResponseEntity2023-01-01
springboot使用校验框架validation校验的示例
这篇文章主要介绍了springboot使用校验框架validation校验的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-02-02
springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能
对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题,下面这篇文章主要给大家介绍了关于springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能的相关资料,需要的朋友可以参考下2023-06-06


最新评论