我们都知道项目后台开发是从 控制层——业务层——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. day82 序列化器-Serializer

    目录 一.序列化器的基本功能 二.定义序列化器 三.创建Serializers对象 四.序列化器的使用 1 序列化 2 反序列化 2.1 数据验证(类比forms组件) 2.2 数据保存 一.序列化器 ...

  2. 接口测试基础——session认证和token认证

    总算是把这个过程理清楚了,现在我们的思路是:what?why?How?,实际上这些个机制产生的内部逻辑是从下至上的的:遇到问题了,想办法解决,总结归纳并取名.从解决一些小问题开始生长,不断打补丁直至完 ...

  3. NW.js Mac App 签名公证流程

    使用 Developer ID 为 Mac 软件签名 - Apple Developer 在MacOS 10.15之前,应用如果没有签名(signature),那么首次打开时就会弹出"无法验 ...

  4. scala 数据结构(十一):流 Stream、视图 View、线程安全的集合、并行集合

    1 流 Stream stream是一个集合.这个集合,可以用于存放无穷多个元素,但是这无穷个元素并不会一次性生产出来,而是需要用到多大的区间,就会动态的生产,末尾元素遵循lazy规则(即:要使用结果 ...

  5. java 面向对象(六):类结构 方法(三) java的值传递机制

    java的值传递机制 1.针对于方法内变量的赋值举例: System.out.println("***********基本数据类型:****************"); int ...

  6. Tomcat的结构

    Tomcat其实就是一个容器,最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务.Service主要包含两部分:Connector和Containe ...

  7. 作为程序员居然没用过这款神器?太out了吧。

    背景 工欲善其事,必先利其器.​后面我将陆陆续续推荐一些软件利器帮助大家提高效率(主要针对 Mac 电脑). 如果你在使用 Mac 电脑,并且没有如某些人那样安装并使用 Windows 系统,那么你可 ...

  8. 【其他-小技巧-Uipath】VB语法操作DataTable分组并求和

    需要对DataTable分组求和的语法:VB.net 和C#中还有点不太一样.最后试了好多方法,要这么写 我的dataTabel数据: (From p In dataTabel.AsEnumerabl ...

  9. 通过hmail搭建一个内网测试的邮件服务器

    ​    我们测试的软件基本上都是支持邮件功能,如果你的测试环境是在外网的话那还好说,可以直接使用QQ邮箱.163邮箱等.但是如果是测试环境在内网,无法直接访问到外网的时候,搭建一个邮件服务器就很有必 ...

  10. J.U.C体系进阶(二):juc-locks 锁框架

    Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-locks 锁框架 接口说明 Lock接口 类型 名称 void loc ...