XMLConfigBuilder工厂模式所对应的源码,并解释一下
时间: 2023-12-12 10:10:57 浏览: 71
XMLConfigBuilder是MyBatis框架中用于解析mybatis-config.xml配置文件的类,它采用工厂模式进行设计。下面是XMLConfigBuilder类对应的源码,并对其进行解释:
```java
public class XMLConfigBuilder extends BaseBuilder {
private boolean parsed;
private final XPathParser parser;
private String environment;
private final ReflectorFactory localReflectorFactory = new DefaultReflectorFactory();
private final MapperBuilderAssistant builderAssistant;
private final Map<String, XNode> sqlFragments = new HashMap<String, XNode>();
public XMLConfigBuilder(Reader reader, String environment, Properties props) {
this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
}
public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
}
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
super(new Configuration());
this.builderAssistant = new MapperBuilderAssistant(configuration, null);
this.parsed = false;
this.environment = environment;
this.parser = parser;
this.configuration.setVariables(props);
}
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration"));
return configuration;
}
private void parseConfiguration(XNode root) {
try {
//解析properties节点,将其中的属性值设置到Configuration对象中
propertiesElement(root.evalNode("properties"));
//解析settings节点,将其中的配置设置到Configuration对象中
Properties settings = settingsAsProperties(root.evalNode("settings"));
loadCustomVfs(settings);
loadCustomLogImpl(settings);
//解析typeAliases节点,将其中的别名注册到Configuration对象中
typeAliasesElement(root.evalNode("typeAliases"));
//解析plugins节点,将其中的插件添加到InterceptorChain对象中
pluginElement(root.evalNode("plugins"));
//解析objectFactory节点,将其中的实现类设置到Configuration对象中
objectFactoryElement(root.evalNode("objectFactory"));
//解析objectWrapperFactory节点,将其中的实现类设置到Configuration对象中
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
//解析reflectorFactory节点,将其中的实现类设置到Configuration对象中
reflectorFactoryElement(root.evalNode("reflectorFactory"));
//将settings节点中的配置设置到Configuration对象中
settingsElement(settings);
//解析environments节点,将其中的环境注册到Configuration对象中
environmentsElement(root.evalNode("environments"));
//解析databaseIdProvider节点,将其中的实现类设置到Configuration对象中
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
//解析typeHandlers节点,将其中的类型处理器注册到Configuration对象中
typeHandlerElement(root.evalNode("typeHandlers"));
//解析mappers节点,将其中的Mapper接口注册到Configuration对象中
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
//省略其他方法...
}
```
XMLConfigBuilder类的构造方法中,接收一个XPathParser对象、一个环境名和一个Properties对象。其中,XPathParser对象用于解析XML文件,环境名用于指定当前使用的是哪个环境的配置,Properties对象用于保存一些配置属性。
XMLConfigBuilder类的parse()方法用于解析mybatis-config.xml配置文件,它首先检查是否已经解析过该文件,如果解析过则抛出异常。然后它调用parseConfiguration()方法进行具体的解析,解析mybatis-config.xml中的各个节点,并将解析结果设置到Configuration对象中。其中,parseConfiguration()方法调用了多个私有方法,用于解析mybatis-config.xml中的各个节点。
这种工厂模式的设计,使得MyBatis框架能够轻松地扩展和维护,只需要添加相应的节点解析方法即可。同时,将解析过程封装到XMLConfigBuilder类中,使得MyBatis框架的其他组件可以直接拿到解析好的Configuration对象,方便使用。
阅读全文