@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接口,系统会自动的去扫描;

手写一个@MapperScan扫描器相关推荐

  1. 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理

    动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...

  2. vue @click 赋值_vue 手写一个时间选择器

    vue 手写一个时间选择器 最近研究了 DatePicker 的实现原理后做了一个 vue 的 DatePicker 组件,今天带大家一步一步实现 DatePicker 的 vue 组件. 原理 Da ...

  3. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!

    零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...

  4. 硬核!手写一个优先队列

    文章收录在首发公众号:bigsai 期待你的到访! 前言 事情还要从一个故事讲起: 对于上面那只可爱的小狗狗不会,本篇即为该教程,首先,我要告诉这只可爱的小狗狗,这种问题你要使用的数据结构为优先队列, ...

  5. ds查找—二叉树平衡因子_面试官让我手写一个平衡二叉树,我当时就笑了

    平衡二叉树对于初学者一直是一个比较复杂的知识点,因为其里面涉及到了大量的旋转操作.把大量的同学都给转晕了.这篇文章最主要的特点就是通过动画的形式演示.确保大家都能看懂.最后是手写一个平衡二叉树. 一. ...

  6. 俄罗斯小方块游戏html,通过h5的canvas手写一个俄罗斯方块小游戏

    开始自己手写一个好玩的俄罗斯方块吧,上变形,左右移动,下加速,空格瞬移等功能,无聊的时候学习下canvas,f12 修改分数,体验金手指的快乐吧 1.定义界面,和按钮 上 下 左 右 2.js部分 1 ...

  7. vue 使用fs_模仿vue-cli,手写一个脚手架

    vue-cli 在vue的开发的过程中,经常会使用到vue-cli脚手架工具去生成一个项目.在终端运行命令vue create hello-world后,就会有许多自动的脚本运行. 为什么会这样运行呢 ...

  8. 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack

    前言 之前好友希望能介绍一下 webapck 相关的内容,所以最近花费了两个多月的准备,终于完成了 webapck 系列,它包括一下几部分: webapck 系列一:手写一个 JavaScript 打 ...

  9. 深度学习笔记:手写一个单隐层的神经网络

    出处:数据科学家养成记 深度学习笔记2:手写一个单隐层的神经网络 笔记1中我们利用 numpy 搭建了神经网络最简单的结构单元:感知机.笔记2将继续学习如何手动搭建神经网络.我们将学习如何利用 num ...

最新文章

  1. 工厂方法模式--结合具体例子学习工厂方法模式
  2. 一元三次方程求解matlab_初中数学最全函数/方程【实际应用题】分类详解提升必学必练!...
  3. 电话开启和电话关闭的命令
  4. Windows WMIC命令使用详解(附实例)
  5. 精英赛上线|冠军万元奖金
  6. 【华为云技术分享】华为云 DevCloud 首席产品布道师:AIOps 不是 DevOps 的下一代
  7. mybatis接口中的方法重载_MyBatis底层实现原理: 动态代理的运用
  8. QT Creator 环境使用 remote debug 调试 arm 程序
  9. PHP array_splice
  10. 读过的书,记录一下,不要忘记提高自己
  11. 控制理论与控制工程算计算机相关专业吗,控制理论与控制工程专业介绍
  12. 利用VS2005进行dump文件调试
  13. 批量打印cad的dwg文件图纸的解决方案
  14. Word 2019如何从任意页开始设置页码?
  15. super是不是java中的标识符_java关键字super和this是什么?有什么区别?
  16. Tomcat修改地址
  17. 《浅谈条形码技术在连锁超市中的应用》论文笔记(二)
  18. 大华监控硬盘录像机恢复程序2.0
  19. 商务网站建设与维护【1】
  20. 市场管理流程介绍(MM流程)

热门文章

  1. Netfilter简介
  2. Pytorch推出fx,量化起飞
  3. 字节跳动面试官:java读取xml文件
  4. UE风格化Day20-光照函数/关于相机的使用
  5. swift3 设置设备方向支持(supportedInterfaceOrientations)
  6. 【已阅】日志与时间戳,客户端与服务器端,打包压缩解压解包介绍,date,cal,zip,unzip,tar指令等
  7. 计算机网络实验项目一
  8. Shiro实现单一登录,并保留使用RememberMe功能。
  9. Oracle数据库create or replace
  10. 新享UniPro推出弹性自动化 管理升级从周报“自由”开始