PS:
读者可以直接观看标题,如果明白该技术可以直接跳过.如果该文章并没有你所需要的mybatis原理可以直接跳过去阅读后面的文章,本章节讲解的知识mybatis所需要用到的一些技术,对于长期使用的人来说可以直接跳过.
前言:
本文章不会着重介绍mybatis的配置,映射和动态sql这些,所谈的原理只涉及基本的框架和核心代码,不会面面俱到,文中的都是集中在mybatis框架的设计和核心代码的实现上,无关的细节适当忽略.如果没有学习或者对java没有经验的人,个人建议还是学习过一定java基础的人来进行阅读.
mybatis的层次结构图:
技术简介:
一.动态代理:
首先我提出一个问题:为什么Mapper只是一个接口,不是一个实现类却可以运行的?
答案就是动态代理.Mapper产生了代理类,这个代理类由Mybatis为我们创建了
代理模式链接地址:https://blog.csdn.net/carson_ho/article/details/54910472 (本文写得很好,可以方便读者很好的理解java中的代理模式这个设计模式)
二.反射技术:
参考反射的一些基础文档:https://blog.csdn.net/ylyang12/article/details/53469957
import com.java.entity.User;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(int.class);
System.out.println(void.class);
int[] arrA = new int[10];
int[] arrB = new int[10];
/**维数相同和类型相同的数组共享同一个Class对象*/
System.out.println(arrA.getClass()==arrB.getClass());
/**同一个类的N多对象,共享同一个Class对象*/
User u1 = new User();
User u2 = new User();
System.out.println(u1.getClass()==u2.getClass());
/**获取Class对象的三种方式*/
//(1)通过对象的getClass()方法获取
Class c1 = u1.getClass();
//(2)通过字节码文件获取
Class c2 = User.class;
//(3)通过Class类的静态方法获取
Class c3 = Class.forName("com.java.entity.User");
System.out.println((c1==c2)+"\t"+(c1==c3));
}
}
这上面这段代码通过反射技术去获取了Class对象,我们可以依靠该技术去创建我们所需要的对象,反射的最大好处是配置性大大提高,就如同Spring IOC容器一样,我们可以给很多配置设置参数,使java应用可以顺利的运行起来,大大提高了Java的灵活性和可配置性,降低模块之间的耦合.
三.JDK动态代理:
上文中提到的动态代理其实分为两种一种就是JDK的动态代理,一种就是CGLIB框架提供的动态代理,现在我们要分别说一下这两种的不同点.
JDK的动态代理基于接口在我们常常使用mybaits的时候默认的动态代理就是JDK的动态代理,这里我也不详细介绍分享一篇文章:https://www.jianshu.com/p/269afd0a52e6
四.CGLIB动态代理:
因为JDK提供的动态代理必须提供接口才能使用,为了克服这个缺陷,于是产生了CGLIB的开源框架,它也是一种流行的动态代理.
一般情况下我们不会使用到CGLIB的动态代理,通常只有在Mybatis中延迟加载的时候才会用到CGLIB的动态代理.
依然分享CGLIB动态代理的一篇文章:https://blog.csdn.net/yhl_jxy/article/details/80633194