我们都知道项目后台开发是从 控制层——业务层——mybatis层,@Controller、@Service、@Mapper...等等注解可以将对象自动加载到bean容器中,还能实现相应的功能,使用起来得心应手。并且模块化实现解耦合,套用模板增删改查等功能很快就写出来。

  那有没有想过一个问题,如果在不同模块中有相同名称的类,那注解将对象自动加载到bean容器中的名称是默认的类名称,会不会有重名的问题?会不会程序启动报错?答案当然会。

    例如:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'imageController' for bean class [io.renren.modules.swr.controller.ImageController] conflicts with existing, non-compatible bean definition of same name and class [io.renren.modules.db.controller.ImageController]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:)
at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:)
... common frames omitted

    利用翻译软件翻译一下:为bean类[io.renren.modules.swr.controller.ImageController]指定的注解bean名称“imageController”与同名类[io.renren.modules.db.controller.ImageController]的现有的、不兼容的bean定义冲突。即,存在两个imageController,导致bean冲突。

    大致知道原因了,怎么解决呢?以下有两种解决方案

  • 修改重复的类名称

    这相当于废话...也感觉很鸡肋,难道没有自定义bean的命名策略吗?肯定有的,请看一下方案

  • 自定义bean命名策略

    @Controller——>@Controller("dbImageController"),可以传入一个String类型的参数(只要不重名叫什么都行,不写默认是小写开头的类名称),表示将bean名称重命名为dbImageController

    例如:

       

    @Service——>@Service("dbImageServiceImpl"),可以传入一个String类型的参数,表示将bean名称重命名为dbImageServiceImpl

    例如:

       

    @Mapper,由于@Mapper不支持传入参数,但是我们可以写个自定义注入的注解@Component("dbImageDao"),表示将bean名称重命名为dbImageDao,等同于@Repository("dbImageDao")

    例如:

       

    ok,现在启动程序,如果你要是使用了基础实体类(继承BaseEntity)的话,你又会发现报错

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.apache.ibatis.type.TypeException: The alias 'ImageEntity' is already mapped to the value 'io.renren.modules.swr.entity.ImageEntity'.
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:)
... common frames omitted
Caused by: org.apache.ibatis.type.TypeException: The alias 'ImageEntity' is already mapped to the value 'io.renren.modules.swr.entity.ImageEntity'.
at org.apache.ibatis.type.TypeAliasRegistry.registerAlias(TypeAliasRegistry.java:)
at org.apache.ibatis.type.TypeAliasRegistry.registerAlias(TypeAliasRegistry.java:)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:)
at java.util.stream.ReferencePipeline$$.accept(ReferencePipeline.java:)
at java.util.stream.ReferencePipeline$$.accept(ReferencePipeline.java:)
at java.util.stream.ReferencePipeline$$.accept(ReferencePipeline.java:)
at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:)
at com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean.buildSqlSessionFactory(MybatisSqlSessionFactoryBean.java:)
at com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean.afterPropertiesSet(MybatisSqlSessionFactoryBean.java:)
at com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean.getObject(MybatisSqlSessionFactoryBean.java:)
at com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration.sqlSessionFactory(MybatisPlusAutoConfiguration.java:)
at com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration$$EnhancerBySpringCGLIB$$1cfc4994.CGLIB$sqlSessionFactory$(<generated>)
at com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration$$EnhancerBySpringCGLIB$$1cfc4994$$FastClassBySpringCGLIB$$641672b3.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:)
at com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration$$EnhancerBySpringCGLIB$$1cfc4994.sqlSessionFactory(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:)
... common frames omitted

    报错信息的翻译是:别名'ImageEntity'已映射到'io.renren.modules.swr.entity.ImageEntity'.

    同样的我们加个注解,@Alias("dbImageEntity"),表示将实体名称重命名为dbImageEntity,重启服务完美解决问题

    例如:

      

  其实技术不是太难,难的是遇到问题解决的过程,但是只有通过困难才能磨练自己,成长的道路上不仅要学会解决问题的技巧。还要学习掌握高级的技能,扩大自己的视野,一步一步实现自己的目标。

Spring bean自定义命名策略(注解实现)的更多相关文章

  1. spring 学习(二):spring bean 管理--配置文件和注解混合使用

    spring 学习(二)spring bean 管理--配置文件和注解混合使用 相似的,创建 maven 工程,配置pom.xml 文件,具体可以参考上一篇博文: sprint 学习(一) 然后我们在 ...

  2. 自定义Spring注解bean的命名策略

    由于项目的需要spring的业务相关的bean不是写在xml文件中,因为项目是一个模块一个模块提交的,提交的时候不想修改xml文件,因此就用到了spring的注解Service. 例如: Java代码 ...

  3. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Spring -bean的装配和注解的使用

    一,bean的装配 bean是依赖注入的,通过spring容器取对象的. 装配方法有: 前面两种没什么好讲的,就改改参数就好了. 这里重要讲注解. 注解的主要类型见图,其中component是bean ...

  5. (九) spring 使用自定义限定符注解

    案例一 定义接口  CD.java package interfacepackage; public interface CD { void play(); } 定义接口 player .java p ...

  6. Spring Bean 有关的那些注解

    尊重原著直接贴链接 https://mp.weixin.qq.com/s/7lhpEo73KG3-xPgbFiaLHw

  7. Hibernate命名策略及配置

    hibernate 表 命名策略         分类:            hibernate2013-02-27 18:46464人阅读评论(0)收藏举报 Hibernate注释下的自定义架构实 ...

  8. hibernate 命名策略

    对于Java开发人员,Hibernate 3 annotations提供了非常好的方式来展示域分层.你可以很轻松的通过Hibernate自动生成需要的数据库架构,带有完整的SQL脚本.然而回到现实世界 ...

  9. 学习Spring-Data-Jpa(四)---Naming命名策略,源码跟踪

    1.首先在Entity实体中,命名方式有两种: 一种是显示命名,即通过@Table的name属性指定对应的数据库表名称,@Column的name属性指定实体字段对应数据库字段的名称. 另一种是隐式命名 ...

随机推荐

  1. CMDB02/ 单例模式、资产采集参考命令、日志处理

    CMDB02/单例模式.资产采集参考命令.日志处理 目录 CMDB02/单例模式.资产采集参考命令.日志处理 1. 单例模式 1.1 多例模式 1.2 单例模式 1.2.1 单例模式/错误 1.2.2 ...

  2. redis(十五):Redis 有序集合(sorted set)(python)

    #coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66 ...

  3. 《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.简介 1. 谁发明了设计模式? 2. 我怎么学不会设计模式? 3. 适 ...

  4. IDEA 导入maven 项目,出现报错,不能运行之类的

    选择pom.xml,右键选择 Add as Maven Project

  5. Python Ethical Hacking - MAC Address & How to Change(1)

    MAC ADDRESS Media Access Control Permanent Physical Unique Assigned by manufacturer WHY CHANGE THE M ...

  6. P1100 高低位切换

    这个题很简单 直接用左移位(<<)和右移位(>>)就可以过了 #include<iostream> #include<cstdio> using nam ...

  7. 数据结构C语言实现----出队伍操作

    1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL 2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历 ...

  8. k8s教程:Kubernetes集群使用网络存储NFS

    NFS存储 NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功 ...

  9. 图文详解压力测试工具JMeter的安装与使用

    压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案.压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性 ...

  10. 【java面试】- 集合篇

    Java 集合概览 从下图可以看出,在Java中除了以Map结尾的类之外, 其他类都实现了Collection接口.并且,以Map结尾的类都实现了Map接口 List.Set.Map三者的区别 Lis ...