您的位置:首页 > 编程语言 > Java开发

Spring源码分析【8】-MyBatis注解方法不能重载

2016-08-18 11:48 1091 查看
代码如下:



这是不可以的,会报错:

2016-08-18 11:36:00,267 [main] ERROR [org.mybatis.spring.mapper.MapperFactoryBean] - Error while adding the mapper 'interface com.unix21.mapper.UserMapper' to configuration.
java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.unix21.mapper.UserMapper.findById
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:837)
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:809)
at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:633)
at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:302)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(MapperAnnotationBuilder.java:325)
at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:130)
at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72)
at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:706)
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:81)


class MapperFactoryBean在mybatis-spring.jar



原因一步步调试出来

org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig



class Configuration在mybatis.jar

org.apache.ibatis.session.Configuration.addMapper



org.apache.ibatis.binding.MapperRegistry.addMapper



knownMappers



MapperProxyFactory



knownMappers.put



org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse



Method[] methods = type.getMethods();



org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement



resultMapId = parseResultMap(method);



parseResultMap



applyResultMap



applyResults



applyResultMap



addResultMap



回到applyResultMap



回到parseResultMap



回到parseStatement



org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement



statementBuilder.parameterMap



org.apache.ibatis.mapping.MappedStatement.parameterMap



回到addMappedStatement



org.apache.ibatis.mapping.MappedStatement.Builder.build



回到addMappedStatement



重点来了

org.apache.ibatis.session.Configuration.addMappedStatement



mappedStatements定义



StrictMap定义继承自HashMap重写了put

多了一行判断

if (containsKey(key))



第一次当然是containsKey(key)=false



返回addMappedStatement,mappedStatements添加完成



一直退到parse



第二次for循环methods



一直下一步...到了第二次mappedStatements.put



containsKey(key)==true产生异常

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: