从底层源码浅析Mybatis初始化过程 (3)

第一步还没有执行完? 是的上述中我们在看构建XMLConfigBuilder对象过程,现在构建完成了我们就需要看这一行代码了parser.parse();; 当有了XMLConfigBuilder对象之后,接下来就可以用它来解析配置文件了

public Configuration parse() { //判断是否已经解析,只能解析一次全局配置文件 if (this.parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } else { //将parsed标记为已经解析 this.parsed = true; //解析全局配置文件的XML中的configuration节点 this.parseConfiguration(this.parser.evalNode("/configuration")); return this.configuration; } } //主要看一下解析全局配置文件的configuration节点的方法 private void parseConfiguration(XNode root) { try { //解析全局配置文件中的properties节点的配置信息存储到Configuration对象的variables属性中 this.propertiesElement(root.evalNode("properties")); //解析全局配置文件中的settings节点的配置信息设置到Configuration对象的各个属性中 Properties settings = this.settingsAsProperties(root.evalNode("settings")); this.loadCustomVfs(settings); this.settingsElement(settings); //解析全局配置文件中的typeAliases节点的配置信息设置到BaseBuilder对象的TypeAliasRegistry属性中 this.typeAliasesElement(root.evalNode("typeAliases")); //解析全局配置文件的plugins this.pluginElement(root.evalNode("plugins")); //解析全局配置文件中的objectFactory设置到Configuration对象的objectFactory属性中 this.objectFactoryElement(root.evalNode("objectFactory")); this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); this.reflectorFactoryElement(root.evalNode("reflectorFactory")); //解析全局配置文件中的Environment节点存储到Configuration对象中的Environment属性中 this.environmentsElement(root.evalNode("environments")); this.databaseIdProviderElement(root.evalNode("databaseIdProvider")); this.typeHandlerElement(root.evalNode("typeHandlers")); //第二步 : 解析全局配置文件中的mappers节点 注意这是一个核心的方法 我们点进去看一下 this.mapperElement(root.evalNode("mappers")); } catch (Exception var3) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3); } }

从上述代码中可以看到,XMLConfigBuilder会依次解析配置文件中的、、、、、等属性。

第二步 : 解析映射配置文件XML到Configuration的mapperRegistry容器 this.mapperElement(root.evalNode("mappers"));

主要功能 : MyBatis会遍历下所有的子节点,如果当前遍历到的节点是,则MyBatis会将该包下的所有Mapper Class注册到configuration的mapperRegistry容器中。如果当前节点为,则会依次获取resource、url、class属性,解析映射文件,并将映射文件对应的Mapper Class注册到configuration的mapperRegistry容器中。

XMLConfigBuilder解析全局配置文件中有一个比较重要的一步;就是解析映射文件this.mapperElement(root.evalNode("mappers"))这句代码开始解析映射文件,我们开看一下下图中构建了一个XMLMapperBuilder对象,这个对象是负责解析映射文件的;而第一步的XMLConfigBuilder对象是解析全局配置文件的

从底层源码浅析Mybatis初始化过程

上图中红色圈中的是Mybatis解析映射文件的方法,我们进去看一下 mapperParser = new XMLMapperBuilder(inputStream, this.configuration, resource, this.configuration.getSqlFragments());

private XMLMapperBuilder(XPathParser parser, Configuration configuration, String resource, Map<String, XNode> sqlFragments) { //首先会初始化父类BaseBuilder,并将configuration赋给BaseBuilder; super(configuration); //然后创建MapperBuilderAssistant对象,该对象为XMLMapperBuilder的协助者,用来协助XMLMapperBuilder完成一些解析映射文件的动作 this.builderAssistant = new MapperBuilderAssistant(configuration, resource); this.parser = parser; this.sqlFragments = sqlFragments; this.resource = resource; } public void parse() { if (!this.configuration.isResourceLoaded(this.resource)) { this.configurationElement(this.parser.evalNode("/mapper")); this.configuration.addLoadedResource(this.resource); this.bindMapperForNamespace(); } this.parsePendingResultMaps(); this.parsePendingCacheRefs(); this.parsePendingStatements(); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfywf.html