这里也只使用一个例子来分析
1 方法bindMapperForNamespace
1private void bindMapperForNamespace() { 2 // cn.vansky.schedule.time.menu.dao.MenuMapper 3 String namespace = builderAssistant.getCurrentNamespace(); 4 if (namespace != null) { 5 Class<?> boundType = null; 6 try { 7 // 根据命名空间来查询相应的接口 8 // interface cn.vansky.schedule.time.menu.dao.MenuMapper 9 boundType = Resources.classForName(namespace); 10 } catch (ClassNotFoundException e) { 11 //ignore, bound type is not required 12 } 13 if (boundType != null) { 14 if (!configuration.hasMapper(boundType)) { 15 // Spring may not know the real resource name so we set a flag 16 // to prevent loading again this resource from the mapper interface 17 // look at MapperAnnotationBuilder#loadXmlResource 18 // 加载过的资源添加到Configuration(全局配置类)里 19 // 属性为Set<String> loadedResources = new HashSet<String>() 20 configuration.addLoadedResource("namespace:" + namespace); 21 // 加载的Mapper添加到Configuration(全局配置类)里 22 // 属性为MapperRegistry mapperRegistry = new MapperRegistry(this) 23 configuration.addMapper(boundType); 24 } 25 } 26 } 27}
上面把加载过的资源文件与加载过的SQLMapper文件放入到Configuration(全局配置类)中。
MyBatis也支持注解方式,那么注释是怎么注入的呢?这个代码就在addMapper方法里面,就来看看相应的代码。
1public <T> void addMapper(Class<T> type) { 2 if (type.isInterface()) { 3 if (hasMapper(type)) { 4 throw new BindingException("Type " + type + " is already known to the MapperRegistry."); 5 } 6 boolean loadCompleted = false; 7 try { 8 knownMappers.put(type, new MapperProxyFactory<T>(type)); 9 // It's important that the type is added before the parser is run 10 // otherwise the binding may automatically be attempted by the 11 // mapper parser. If the type is already known, it won't try. 12 MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type); 13 // 注解的解析 14 parser.parse(); 15 loadCompleted = true; 16 } finally { 17 if (!loadCompleted) { 18 knownMappers.remove(type); 19 } 20 } 21 } 22}
这里不在对注解方式进行分析,有兴趣的童鞋,可以自行分析一下。

上图就是Configuration(全局配置类)中添加Mapper的位置及相应的属性。