关于@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


猜你喜欢
- 以下实例演示了如何使用 retainAll () 方法来计算两个数组的交集:Main.java 文件:import java.util.Ar
- 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。Spring Framework对事务管理提供了一致的
- 背景笔者所在项目组在搭建一个全新项目的时候选用了SpringBoot3.x,项目中应用了很多SpringBoot2.x时代相关的第三方组件例
- 目录切换语言核心代码使用dragonFace改系统语言本篇简单介绍将在Android App中进行语言的切换和使用dragonFace改系统
- 目标:了解Swagger的作用和概念了解前后端分离在springBoot中集成SwaggerSwagger简介前后端分离VUE+spring
- 本文实例为大家分享了android通过NFC读取卡号的具体代码,供大家参考,具体内容如下1.获取权限<uses-permission
- 本文实例讲述了Android通过应用程序创建快捷方式的方法。分享给大家供大家参考。具体如下:Android 快捷方式是桌面最基本的组件。它用
- 本文实例为大家分享了Android系统级悬浮按钮的具体代码,供大家参考,具体内容如下具体的需求1、就是做一个系统级的悬浮按钮,就像iPhon
- 前言工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段。当然你使用线程计数可以实现,只是不够优
- 平时用到的库仓库名地址备注mavenCentralhttps://repo1.maven.org/maven2/
- 在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。这些功能对于手机非常适用,但是对于机
- 我自己在使用的过程中遇见的问题,百度找了很久才找到合适的方法。报错如下:Emulator: emulator: ERROR: Unknown
- spring cloud 配置中心native配置1、pom文件添加依赖<dependency> &l
- 前言自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下
- 之前的工作中,需要实现一个功能就是GridView中的item可以自由拖动, 思考了一下,其实实现起来不是很困难,主要工作就是交换节点,以及
- 从英文中重建数字给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。示例 1:输入:s
- mybatis项目CRUD步骤1.pom.xml引入相应的依赖<?xml version="1.0" encodi
- 本文实例讲述了C#实现Excel导入sqlite的方法,是非常实用的技巧。分享给大家供大家参考。具体方法如下:首先需要引用system.da
- 经典的Java基础面试题集锦,欢迎收藏和分享。问题:如果main方法被声明为private会怎样?答案:能正常编译,但运行的时候会提示”ma
- 前言CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流