首页 > 编程语言 > 详细

简单演示springAOP在Mybatis中的使用

时间:2021-09-01 14:57:43      阅读:6      评论:0      收藏:0      [点我收藏+]

MybatisgetMapper底层就是JDK的动态代理,并且运用了springAOP

外部调用

基于sqlSession使用getMapper(接口 . Class)获得动态代理对象

技术分享图片

 

第一层内置类 DefaultSqlSession.java

此时getMapper会将Class对象和this对象(代指上图的sqlSession)一同传到另一个getMapper中

技术分享图片

 

第二层内置类 Configuration.java

技术分享图片

 

第三层内置类 MapperRegistry.java

进一步进入getMapper 就能来到最终执行的地方

技术分享图片

 

BindingException 用来抛出异常 我们常见的也就是这个异常

传入的SysUserMapper要注册到MapperRegistry上,如果没有注册成功就会抛出这个异常

 

技术分享图片

 

比如mybatis核心配置文件中没有成功配置SysUserMapper的接口对应的映射文件,就会出这个异常

图中假如没有配置包扫描,使用的是手动配置,然后漏掉了映射文件,就会报这个异常

技术分享图片

 

假如注册成功就会是如下情况

技术分享图片

 

当注册成功后,进一步进入newInstance这个方法

技术分享图片

 

第四层内置类 MapperProxyFactory.java

在这一个类中,会跳转到newInstance方法 这就是JDK的动态代理

在方法的参数表中可以看到 目标对象的类加载器 ,一个新创建的Class数组,一个MapperProxy对象

①目标对象的类加载器

这个东西不是很重要,可以传入任意对象的类加载器,通常传入目标对象,也可以不传,它有默认的ClassLoader()

 

Class数组

对应着手写的方法中的getInterfaces() ,这是这里是直接传入了一个指向目标对象的接口的Class对象到数组中,形成一个Class对象数组

之所以是一个数组是因为JAVA存在单继承多接口的情况

 

 

MapperProxy对象

对应着手写的方法中的InvocationHandler(),必须是一个实现了InvocationHandler接口的对象,或者就干脆是一个“new InvocationHandler()”的匿名函数

 

技术分享图片

 

第五层内置类 MapperProxy.java

通过MapperProxy对象进入这个类,可以看到这个类实现了InvocationHandler接口

技术分享图片

 

手写动态代理方法时,InvocationHandler方法是即时new 即时用 用完就没了 是一个匿名函数

在这里则是由一个有固定名字的类实现了接口,不再以匿名函数的方式使用,并且这个类中肯定有invoke方法,用于执行目标对象中的方法

仔细查看,可以找到这个invoke方法

技术分享图片

 

这个invoke方法会判断method是否来自于object

如果是就不进行增强,比如toStringgetClass

技术分享图片

 

执行完毕后就会输出对象

技术分享图片

 

如果不是,则执行增强

技术分享图片

 

 

源码中代理类实现的接口是一个list集合 因为目标对象可能实现了多个接口

技术分享图片

 

技术分享图片

 

简单演示springAOP在Mybatis中的使用

原文:https://www.cnblogs.com/BRSblackshoot/p/15212291.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!