MyBatis框架中的建造者模式XMLConfigBuilder和XMLMapperBuilder
在MyBatis框架中,XMLConfigBuilder和XMLMapperBuilder是建造者模式的典型应用。
建造者模式是一种创建型设计模式,用于将对象的构建过程与其表示分离,以便与同一个构建过程可以创建不同的表示。建造者模式将对象的构建过程委派给不同的建造者,每个建造者负责构建对象的一部分,最后由指挥者调用建造者的方法来组装对象。这样可以实现创建复杂对象的过程简化和灵活性的提高。
XMLConfigBuilder和XMLMapperBuilder是MyBatis框架中的两个重要建造者类。
XMLConfigBuilder用于解析MyBatis的配置文件,即mybatis-config.xml,它的主要职责是构建Configuration对象。XMLConfigBuilder根据配置文件的内容,将各个子配置(如数据源配置、类型别名配置、映射器配置等)的解析委托给相应的建造者进行处理,最后通过Configuration对象将这些配置整合在一起。
XMLMapperBuilder用于解析Mapper映射文件,即*.xml,它的主要职责是构建MappedStatement对象和将其注册到Configuration对象中。XMLMapperBuilder通过解析Mapper映射文件中的SQL语句和对应的解析器,来构建MappedStatement对象。
以下是MyBatis框架中XMLConfigBuilder和XMLMapperBuilder的部分原码:
// XMLConfigBuilder.java
public class XMLConfigBuilder extends BaseBuilder {
public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
// ...
}
public Configuration parse() {
// ...
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
private void parseConfiguration(XNode root) {
try {
// ...
XNode environmentsNode = root.evalNode("environments");
parseEnvironments(environmentsNode);
// ...
} catch (Exception e) {
// ...
}
}
// ...
}
// XMLMapperBuilder.java
public class XMLMapperBuilder extends BaseBuilder {
public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments, String namespace) {
// ...
}
public void parse() {
try {
// ...
XNode context = document.getRootElement();
// ...
configurationElement(context);
} catch (Exception e) {
// ...
}
}
private void configurationElement(XNode context) {
try {
String namespace = context.getStringAttribute("namespace");
// ...
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
// ...
} catch (Exception e) {
// ...
}
}
private void buildStatementFromContext(List<XNode> list) {
// ...
for (XNode context : list) {
final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);
// ...
statementParser.parseStatementNode();
}
}
// ...
}
总结:
通过建造者模式,MyBatis框架将对象的构建过程与对象的表示分离,使得构建过程灵活且易于维护。XMLConfigBuilder和XMLMapperBuilder用于解析配置文件和映射文件,将其构建为相应的对象,并将它们注册到MyBatis的Configuration对象中。这样可以实现对配置文件和映射文件的统一管理和灵活使用。建造者模式在MyBatis框架中的应用体现了面向对象设计原则中的开闭原则和单一职责原则。