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();
}
......
}
- 附上源碼包結構做參考: