例子
同一个命名空间,但是有2个配置文件,A配置文件依赖于B配置文件信息,但是在加载时,先加载B配置文件的话,那么就会报错,前面章节已经捕获了此异常并把相应的配置添加到Configuration(全局配置类)中,这里就是在加载A配置文件后,再次加载B配置文件,也就把B配置信息添加到Configuration(全局配置类)里,下面就来看一下代码吧。
1 方法parsePendingResultMaps
private void parsePendingResultMaps() { Collection<ResultMapResolver> incompleteResultMaps = configuration.getIncompleteResultMaps(); synchronized (incompleteResultMaps) { Iterator<ResultMapResolver> iter = incompleteResultMaps.iterator(); while (iter.hasNext()) { try { iter.next().resolve(); iter.remove(); } catch (IncompleteElementException e) { // ResultMap is still missing a resource... } } } }
2 方法parsePendingChacheRefs
private void parsePendingChacheRefs() { Collection<CacheRefResolver> incompleteCacheRefs = configuration.getIncompleteCacheRefs(); synchronized (incompleteCacheRefs) { Iterator<CacheRefResolver> iter = incompleteCacheRefs.iterator(); while (iter.hasNext()) { try { iter.next().resolveCacheRef(); iter.remove(); } catch (IncompleteElementException e) { // Cache ref is still missing a resource... } } } }
3 方法parsePendingStatements
private void parsePendingStatements() { Collection<XMLStatementBuilder> incompleteStatements = configuration.getIncompleteStatements(); synchronized (incompleteStatements) { Iterator<XMLStatementBuilder> iter = incompleteStatements.iterator(); while (iter.hasNext()) { try { iter.next().parseStatementNode(); iter.remove(); } catch (IncompleteElementException e) { // Statement is still missing a resource... } } } }
以上3个方法就是因为加载顺序错误的重复处理逻辑,加载的代码与前面一样,这里不再分析。
总结
以上文章就是MyBatis对配置文件的初始化,这里至少分析了60%,对理解MyBatis已经够了。MyBatis也就剩最后一步了,建立SqlSessionFactory工厂,这个工厂也是唯一的,MyBatis默认使用的是org.apache.ibatis.session.defaults.DefaultSqlSessionFactory类。这里以后在分析。
时间: 2024-10-14 00:59:37