3.Mybatis-Spring源码设计思想分析

3.Mybatis-Spring源码设计思想分析

    • JDBC链接数据库逻辑
    • 优化冗余代码抽象思路
    • Mybatis-Spring整合使用
      • 注册
      • 初始化时创建代理类
      • 调用装载过程
      • 调用执行方法时
      • 调用的设计思想
      • 主要中间对象

JDBC链接数据库逻辑

1、加载驱动,Driver.ClassLoad(OracleJDBC);
2、创建连接Connection,url、账户密码
3、获取语句集
4、前置参数处理
5、执行
6、获取结果集
7、关闭连接
8、返回查询结果

优化冗余代码抽象思路

1、加载驱动、创建连接、关闭连接 封装到一个顶层公共类中。
2、新增处理语句集的类StatementHandler,生成语句集。
3、新增前置参数处理的类ParameterHandler,处理和装配参数。
4、新增执行的类Executor,执行SQL(持有StatementHandler,StatementHandler调用ParameterHandler和ResultSetHandler的处理)。
5、新增结果集处理的类ResultSetHandler处理结果集,映射查询结果和对象。

Mybatis-Spring整合使用

注册

1、MapperScannerConfigurer,注册类到Spring容器中
2、使用SqlSessionFactoryBean作为session的工厂类,Configuration作为interceptorChain(装载了interceptor的容器)的承载(Configuration持有interceptorChain)

初始化时创建代理类

调用SqlSessionFactory的build的openSession方法拿到代理过后的Executor,然后供后面调用执行方法。

调用装载过程

1、SqlSessionFactoryBean->buildSqlSessionFactory.build()=得到DefaultSqlSession(SqlSessionFactory)
2、DefaultSqlSessionFactory.openSession()->new Executor->this.interceptorChain.pluginAll(executor)=for循环调用interceptors.plugin wrap代理target(Executor)

调用执行方法时

拿到的是层层代理后的target(Executor的多层代理类),然后通过JDK动态代理Plugin方法中一层一层调用Interceptor.intercept方法执行实际拦截的方法。最终的目标方法通过Plugin的invoke方法中的method.invoke(),或者interceptor中调用handler.query(stmt,resultHandler),或者interceptor中调用前面传递的Invocation.proceed(这方法里面也是一样调用method.invoke(this.target,this.args);)

调用的设计思想

调用时动态代理
1、所有插件实现统一的接口Interceptor,为Proxy.newProxyInstance中的链式代理提供了可能。
2、调用InterceptorChain的pluginAll方法做代理处理,for循环interceptors,调用interceptor的plugin,plugin方法调用Plugin.wrap做动态代理处理,返回一个层层封装的代理对象(StatementHandler)。
3、wrap封装的动态代理参数:类加载器(具体的类的ClassLoader(Executor的ClassLoader)),所有实现的接口(需要拦截的signatureMap签名参数包含注解的拦截接口(4大对象),这些接口的实现方法可被代理拦截),触发管理器(Plugin他自己,持有:具体类实例、interceptor插件实例,插件注解的拦截点)。
4、调用这个代理对象的任意方法会触发h的invoke方法,进而调用interceptor的intercept方法,进而再触发下一层的invoke方法,如此一层一层调用invoke,直到最后一层(目标方法,当前方法已不在signatureMap的注解map中,说明不是注解对象了,也就不是插件对象了)执行实际对象的方法。

target是啥?target就是Executor,使用时会调用SqlSession中的API方法,调用executor的query方法

主要中间对象

Plugin -> InvocationHandler
InterceptorChain
Interceptor

你可能感兴趣的:(Mybatis)