mybatis自动扫描mapper的工作原理
来源:互联网 发布:js给服务器控件赋值 编辑:程序博客网 时间:2024/04/25 20:13
在mybatis中,我们可以在配置文件中使用自动扫描,也就是在mappers中使用package,但是mybatis的扫描原理是什么呢?
首先在mybatis中读取配置文件中的mappers元素,在这个元素中分成两类处理:mapper和package,mapper不在我们的讨论之内,我们只是研究package,这个标签就是自动扫描的配置.
下面是处理package的代码
String mapperPackage = child.getStringAttribute("name");configuration.addMappers(mapperPackage);
跟踪源码,进入真正扫描将包中的内容是在如下代码
<pre name="code" class="java"> public void addMappers(String packageName, Class<?> superType) { ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>(); resolverUtil.find(new ResolverUtil.IsA(superType), packageName); Set<Class<? extends Class<?>>> mapperSet = resolverUtil.getClasses(); for (Class<?> mapperClass : mapperSet) { addMapper(mapperClass); } }}
下面是我在跟踪源码时mapperSet的内容[class com.min.mapper.ItemsMapperTest, interface com.min.mapper.UserMapper, class com.min.mapper.OrderMapperTest$2, class com.min.mapper.UserMapperTest, class com.min.mapper.OrderMapperTest$1, interface com.min.mapper.ItemsMapper, interface com.min.mapper.OrderMapper, class com.min.mapper.OrderMapperTest]
从中可以看出,这个是先将包中所有的类文件都加载了,在addMapper方法中进行了筛选,代码如下
if (type.isInterface()) { if (hasMapper(type)) { throw new BindingException("Type " + type + " is already known to the MapperRegistry."); } boolean loadCompleted = false; try { knownMappers.put(type, new MapperProxyFactory<T>(type)); // It's important that the type is added before the parser is run // otherwise the binding may automatically be attempted by the // mapper parser. If the type is already known, it won't try. MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type); parser.parse(); loadCompleted = true; } finally { if (!loadCompleted) { knownMappers.remove(type); } } }在addMapper方法中,会对所有的接口生成代理,也就是如果你的不需要生成代理的接口如果放在自动扫描的包中,如果你没有配置相应的xml文件,将会报错,如果你配置了相应的文件,这时将会生成代理对象.
如果你使用mapper已经配置了这个类的代理对象,如果这个类还在扫描包中,这时会报 Type interface com.min.mapper.UserMapper is already known to the MapperRegistry.l类型已经注册了,
如果当前类没有注册,那么mybatis会先扫描当前包中的类文件,在扫描包中的xml文件,具体代码可以跟踪org.apache.ibatis.binding.MapperRegistry类中的public <T> void addMapper(Class<T> type) 方法.
最后总结一下:
mybatis通过解析全局配置文件,解析到mappers时,在读取其中的所有元素,其中package为自动扫描的包.mybatis会将包中所有的类加载,循环判断其中的接口,并为其生成代理,
- mybatis自动扫描mapper的工作原理
- 从MapperScannerConfigurer看MyBatis自动扫描Mapper的机制
- 从MapperScannerConfigurer看MyBatis自动扫描Mapper的机制
- 【mybatis】mapper.xml文件自动扫描注入的方法
- Mybatis扫描不到mapper的奇葩问题
- SpringMVC + Mybatis模式 MapperScannerConfigurer 自动扫描Mapper接口
- 关于idea 与Mybatis自动扫描注册mapper bean的在IDE中提示无法自动注入的解决方案
- spring配置mybatis自动扫描*mapper.java和*mapper.xml配置文件
- mybatis自动生成mapper.xml的方法
- mybatis 扫描多个mapper
- mybatis 自动生成 mapper
- mybatis的mapper.xml文件扫描注册问题
- idea上mybatis遇到的mapper扫描问题
- SpringBoot整合Mybatis扫描不到Mapper的问题
- mybatis的工作原理
- MyBatis的工作原理
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
- leetcode: Product of Array Except Self
- linux grep命令详解
- objective-C面向对象理解(上)
- CVPR 2010 papers
- Linux网络编程学习笔记(一)
- mybatis自动扫描mapper的工作原理
- 安装mysql过程还有出现的一些问题
- CVPR 2009 papers
- ListView无监听或setOnItemClickListener无效
- 黑马程序员_java集合1
- CVPR 2008 papers
- Avro序列化/反序列化
- smarty 比较操作符
- 黑马程序员——java基础——多线程的学习总结