Mybatis源码之代理Proxy设计模式

      JAVA设计模式分为创建型、行为型与结构型三类设计模式,代理模式与适配器、装饰器、组合模式、外观模式等7种都属于结构型设计模式。

     一、 基本定义与组成

       代理模式提供一个实际的目标代理对象,方便在完成被控制目标对象相同功能的基础上,附加实现其他功能,如在完成功能实现的同时,提供参数检查、日志记录、权限验证等非主线操作。注意:代理模式与装饰器模式的主要区别在于代理模式提供完全相同的接口,而装饰器模式增强了接口,与适配器模式区别在于更改了接口。

        在JDK与开源框架中,代理模式常用来实现RMI远程代理、安全代理、缓存代理与智能代理功能,在Spring框架的AOP面向切面编程@Aspect、@Around、@Pointcut注解就是典型的代理模式应用。

       构成要素包括Subject(主题接口)、RealSubject(真实对象)、ProxySubject(代理对象),类图结果如下图:

代理模式类图与示范代码

        二、Mybatis执行器Executor代理模式

        Mybatis框架的SQL执行核心主体接口Executor,定义了update、query、queryCursor、commit、rollback等基础的数据库操作功能,由SimpleExecutor类实现,同时,为了实现结果缓存、批量处理等功能,提供CachingExecutor与BatchExecutor等其他执行器,其中,CachingExecutor采用代理模式实现结果集缓存管理功能。UML类图如下:

        分析Mybatis执行器源代码,Executor定义执行器接口功能约定,SimpleExecutor通过集成JDBC与数据库服务器常用操作,BatchExecutor实现批量数据处理,ReuseExecutor通过HashMap缓存参数化SQL语句实现SQL重用,CachingExecutor通过代理模式实现查询结果集缓存管理。

       在Configuration类newExecutor函数实现中,如果配置支持结果集缓存功能,其它类型的Executor作为CachingExecutor构造函数参数传入,代码片段如下图:

newExecutor函数片段

分析CachingExecutor的query函数源代码:

CachingExecutor查询函数query实现缓存

      函数query由执行器Executor接口定义,SimpleExecutor集成JDBC实现数据库查询操作,CachingExecutor类提供缓存功能包装。CachingExecutor的query函数执行步骤:1)检查是否配置缓存策略;2)不支持缓存,直接调用代理对象delegate的query函数;3)支持缓存,利用key获取查询缓存,有缓存则直接返回缓存;没有缓存,调用delegate的query函数查询数据库,缓存结果记录集;5)返回查询结果集。

       三、学习总结

      代理模式,代理对象控制一个被代理的目标对象,两者实现相同的主题接口,代理对象函数在调用真实对象的同签名函数基础上,附加实现其它功能。代理模式常用与RMI远程代理、缓存代理、日志记录、Spring的AOP面向切面编程等应用场景。

你可能感兴趣的:(Mybatis源码之代理Proxy设计模式)