builder包主要功能
- builder包的核心功能很简单,就是解析注解或者解析xml配置文件,将配置汇总到session包的一个大杂烩的类Configuration中(builder下的annotation包是解析注解相关本文不分析);
- 核心是三个类:XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder分别解析mybatis-config.xml、XxxMapper.xml、XxxMapper.xml中的每一个sql语句;
- 值得注意的是XMLStatementBuilder的parseStatementNode方法调用了scripting包中的XMLScriptBuilder完成整整的sql语句解析(其实是间接通过调用scripting包中的LanguageDriver类调用的)。
builder包主要结构
builder包设计模式
-
装饰设计模式,XMLMapperBuilder、XMLStatementBuilder、MapperBuilderAssistant都继承于BaseBuilder,而且XMLMapperBuilder、XMLStatementBuilder都包含MapperBuilderAssistant,MapperBuilderAssistant是被装饰者,解耦合,被装饰者的变话不影响装饰者的使用;
-
附上一段源码做参考:
/**
- @author Clinton Begin
- BaseBuilder下的每个子类在使用构造器实例化时,必定会调用BaseBuilder的构造方法,这是因为BaseBuilder内部维护着三个属性Configuration,TypeAliasRegistry,TypeHandlerRegistry。Configuration本身是一个"大杂烩",内部维护着各种各样的对象实例。
- TypeAliasRegistry,TypeHandlerRegistry就是其中两个,事实上,BaseBuilder的这两个实例就是从Configuration获取的,为什么要这样做呢?在编写mybatis配置文件时,有时候需要自定义参数别名和类型处理器,在解析配置文件的过程中,必须将自定义的别名处理器重新放入Configuration中
*/
public abstract class BaseBuilder {
protected final Configuration configuration;
protected final TypeAliasRegistry typeAliasRegistry;
protected final TypeHandlerRegistry typeHandlerRegistry;
public BaseBuilder(Configuration configuration) {
this.configuration = configuration;
this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
}
......
}
- 附上源码包结构做参考: