关于@MapperScan包扫描的坑及解决
作者:Toor 发布时间:2023-02-13 02:45:46
标签:@MapperScan,扫描
@MapperScan包扫描的坑
在使用通用mapper执行查询时,由于不太注意顺手就导了spring的包:
import org.mybatis.spring.annotation.MapperScan;
结果就异常:
tk.mybatis.mapper.provider.base.BaseSelectProvider:xxxx
找了半天才发现是包的问题,应该导mybatis的MapperScan而不是spring中的包,正确的包名:
import tk.mybatis.spring.annotation.MapperScan;
手写一个@MapperScan扫描器
@MapperScan
1.@MapperScan这个注解是由MyBatis提供的;
2.只能使用在类上;
3.主要功能是扫描到指定包下接口的生成Class对象
注解使用在类上,指定value的值可以指定扫描的包,把扫描到的包中的接口,生成 * 注入到Spring的ioc容器中;
自己手写该注解的思路
1.需要使用一个类,把使用这个注解的类加载加载(把Class对象注册进来);
2.解析这个类上是否有@MapperScan注解;
3.然后解析@MapperScan注解上的value值得到接口的路径;
4.根据路径扫描有哪些接口;
5.根据接口名和classpath路径,把接口加载进来;
6.把接口的class对象保存在List中;
#7.接下来就是Mybatis框架生成 * ;
注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BeanScan {
String value();
}
//生成MapperScan这个类的处理逻辑
public class MapperScan {
//通过解析BeanScan来得到文件目录
Class<BeanScan> beanScanClass;
/**
*Class这个参数是使用@MapperScan这个类的class对象
*/
public ArrayList<Class> scan(Class aClass) throws ClassNotFoundException {
//创建一个ArrayList存放生成的接口的class对象
ArrayList<Class> mapperName = new ArrayList<>();
//解析传入的aclass对象得到@MapperSCan这个注解
//BeanScan这个我们定义的@mapperScan注解
BeanScan BeanScan = (com.scan.BeanScan) aClass.getDeclaredAnnotation(BeanScan.class);
//通过BeanScan对象的到接口的路径
String path = BeanScan.value();
//获得当前的类加载器(可以用类加载器得到classpath,然后使用File对象操作文件)
ClassLoader classLoader = aClass.getClassLoader();
//接口的路径是"."转换成"\"
String replacePath = path.replace(".", "\\");
//通过类加载器获取当前文件的绝对路径
URL resource = classLoader.getResource(replacePath);
//通过文件的绝对路径把文件编程File对象
String file = resource.getFile();
File file1 = new File(file);
//判断File对象是否是目录
if(file1.isDirectory()){
//把File对象下的文件名称取出来
File[] files = file1.listFiles();
for (File f :files) {
//字符串拼接操作(把字符串拼接成系统类加载器可以加载的格式)
String name1 = file1.getName();
String name = f.getName();
String pathName = name1+"."+name;
String substring = pathName.substring(0, pathName.indexOf(".class"));
//把接口的全限定名称传入生成class对象,放入到list集合中
Class<?> aClass1 = ClassLoader.loadClass(substring);
mapperName.add(aClass1);
System.out.println(aClass1);
}
}
return mapperName;
}
}
#有了这个注解后,我们就不用手动去传入接口的class对象来生成 *
只需要在指定的文件下在创建Mapper接口,系统会自动的去扫描;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/lamar_quin/article/details/85240294
0
投稿
猜你喜欢
- IDEA设置文档注释模板创建Class文件时自动生成的头部注释如图如何配置idea的头部注释格式,可以生成像之前的注释格式一样的文档注释?F
- 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。
- Synchronized的用法在多线程并发问题中,常用Synchronized锁解决问题。Synchronized锁通常用于同步示例方法,同
- 本文实例讲述了Java Swing实现让窗体居中显示的方法。分享给大家供大家参考,具体如下:Swing组件是AWT组建的增强组件,是功能强大
- 本文实例讲述了Android中断线程的处理方法。分享给大家供大家参考。具体方法如下:我现在对一个用户注册的功能1.用ProgressDial
- 之前写了一篇文章:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文
- Java有一种特殊线程,守护线程,这种线程优先级特别低,只有在同一程序中的其他线程不执行时才会执行。由于守护线程拥有这些特性,所以,一般用为
- 首先看下面这一段代码:interface a{ void b();}interface a1 extends a{
- 用Stream解决两层List属性求和假设一个人有很多个银行账户,每个银行账户中存有不同金额的存款,那么我们如何用Stream求一组人的所有
- 拆分字符串:这个可以使用两次分割,第一次使用 | 分割,放到arr数组里,然后使用循环对arr[i]进行使用:分割public static
- sms4j 2.0 全新来袭即sms-aggregation成功加入dromara之后,很多人向我们反应了项目名称太长不好记,也太绕口, 在
- 前言在我们开发过程中,由于主流的架构都是采用前后端分离的方式,我们作为后端开发者需要为前段持续地提供运行在容器中最新代码,虽然可
- 众所周知Web服务器与客户端之间的通信是使用HTTP协议的。HTTP是一个客户端和服务器端请求和应答的标准(TCP)。因为HTTP协议是基于
- 这几天自己研究了关于地手机上面开发安卓地图的问题,发现百度官方示例demo讲解百度持续定位方面还是讲解的有些不清楚,本人研究了几次之后将其弄
- Lambda表达式无法抛出异常1.Demo 例子错误提示 - Unhandled exception: java.io.IOExceptio
- 目录一、Collections.sort的简单使用二、问题提出三、Comparable实现排序四、Comparator实现排序五、Compa
- @Autowired注解注入的xxxMapper报错项目场景Mybatis-Plus测试问题描述在Mybatis-Plus场景的测试中发现,
- 五丶封装(1)包的概念与创建1>概念在我们的电脑上有许多的文件,我们为了方便管理,大致给它们进行了不同的命名。然后在不同的文件夹下面再
- 自定义starter yaml提示失效问题问题场景在自定义starter后,必不可少会有properties配置参数需要指定,而在有时又不知
- 配置操作第一步操作如图:选择右侧的database页签,一般在idea的右边会有Database界面,点击它即可。有时候我们会发现这个Dat