我们都知道项目后台开发是从 控制层——业务层——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. 查看mysql所有命令

  2. 已知如下代码,如何修改才能让图片宽度为 300px ?注意下面代码不可修改。

    <img src="1.jpg" style="width:480px!important;”> 总结: max-width:300px transform: ...

  3. node+express4+multiparty实现简单文件上传

    文件上传 var fs = require('fs'); var express = require('express'); var multiparty = require('multiparty' ...

  4. java 面向对象(二十四):interface:接口

    interface:接口1.使用说明: 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能 ...

  5. vue 写h5页面-摇一摇

    依赖的第三方的插件 shake.js github地址: https://github.com/alexgibson/shake.js 提供一个摇一摇音效下载地址:http://aspx.sc.chi ...

  6. 关于springboot中过滤器和拦截器

    在解决跨域问题中,发现拦截器和过滤器用得不是熟练.就参考了下一下两个作者的文档.希望大家也可以汲取精华 文档1   https://blog.csdn.net/moonpure/article/det ...

  7. IDEA JRebel热部署( IDEA版本是2020.1.2)

    1.安装JRebel插件 在IDEA->Settings->plugins先安装JRebel插件: 2.下载工具 安装好JRebel后,找到lanyus大神文章中写的git地址:http: ...

  8. Python Ethical Hacking - NETWORK_SCANNER(1)

    NETWORK_SCANNER Discover all devices on the network. Display their IP address. Display their MAC add ...

  9. HDU-2473 Junk-Mail Filter(并查集的使用)

    原题链接:https://vjudge.net/problem/11782/origin Description: Recognizing junk mails is a tough task. Th ...

  10. PyQt5主界面

    QMainWindow QMainWindow控件继承之QWidget控件,QWidget是所有控件的父类,主要提供界面的基本功能,包括边框.标题.工具栏.关闭按钮.最小化按钮以及最大化按钮等.子类中 ...