博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis-3.4.2-源码分析17:XML解析之bindMapperForNamespace
阅读量:6372 次
发布时间:2019-06-23

本文共 3909 字,大约阅读时间需要 13 分钟。

hot3.png

之前调试时,发现1个问题,就是mapperRegistry找不到对象

后来发现是mapper.xml的namespace里面的类名写得不对,然后来重新debug下

---

断点在

stop in org.apache.ibatis.builder.xml.XMLMapperBuilder.bindMapperForNamespace

调试

private void bindMapperForNamespace() {		// 看到这里了		String namespace = builderAssistant.getCurrentNamespace();		System.out.println("namespace--->"+namespace);		if (namespace != null) {			// 如果设置了			Class
boundType = null; try { // 看看是不是类 boundType = Resources.classForName(namespace); } catch (ClassNotFoundException e) { // ignore, bound type is not required } //如果真的是类/接口 if (boundType != null) { System.out.println("boundType--->"+boundType); //之前没有绑定 if (!configuration.hasMapper(boundType)) { // Spring may not know the real resource name so we set a // flag // to prevent loading again this resource from the mapper // interface // look at MapperAnnotationBuilder#loadXmlResource //关键这里 configuration.addLoadedResource("namespace:" + namespace); configuration.addMapper(boundType); } } } }

可以看到,关键就是

configuration.addLoadedResource("namespace:" + namespace);					configuration.addMapper(boundType);

 跟进去

第1行就是标记这个资源加载过了,见下图

319    		loadedResources.add(resource);main[1] print loadedResources loadedResources = "[mysql_mapper.xml]"main[1] step> Step completed: "thread=main", org.apache.ibatis.session.Configuration.addLoadedResource(), line=320 bci=11320    	}main[1] print loadedResources loadedResources = "[mysql_mapper.xml, namespace:interfaces.RoleMapper]"

看第2行

configuration.addMapper(boundType);
public 
void addMapper(Class
type) { // 交给mapperRegistry负责 mapperRegistry.addMapper(type); }

跟进去

public 
void addMapper(Class
type) { //这里开始 //还必须是接口 if (type.isInterface()) { //防止重复注册 if (hasMapper(type)) { throw new BindingException("Type " + type + " is already known to the MapperRegistry."); } // boolean loadCompleted = false; try { //开始注册 knownMappers.put(type, new MapperProxyFactory
(type)); // It's important that the type is added before the parser is // run // otherwise the binding may automatically be attempted by the // mapper parser. If the type is already known, it won't try. MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type); parser.parse(); loadCompleted = true; } finally { if (!loadCompleted) { knownMappers.remove(type); } } } }

这里继续跟踪

knownMappers.put(type, new MapperProxyFactory<T>(type));

/** * @author Lasse Voss */public class MapperProxyFactory
{ // 接口类 private final Class
mapperInterface; // 方法容器 private final Map
methodCache = new ConcurrentHashMap
(); public MapperProxyFactory(Class
mapperInterface) { // 设置接口类 this.mapperInterface = mapperInterface; //end }

---然后就剩下

MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);

                parser.parse();

先看MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);

然后就是parse解析过程了

---

public void parse() {		// 开始解析		String resource = type.toString();		// 如果没有加载过		if (!configuration.isResourceLoaded(resource)) {			// 进来			// 这1行不执行			loadXmlResource();			// 标记已经加载过了			configuration.addLoadedResource(resource);			//			assistant.setCurrentNamespace(type.getName());			// 继续执行			// 下面2行注释掉			parseCache();			parseCacheRef();			//正式			//获取类的方法			Method[] methods = type.getMethods();			//遍历每1个方法			for (Method method : methods) {				//				try {					// issue #237					//如果不是bridge方法					if (!method.isBridge()) {						//解析此方法						parseStatement(method);					}				} catch (IncompleteElementException e) {					configuration.addIncompleteMethod(new MethodResolver(this, method));				}			}		}		parsePendingMethods();	}

上面是注解解析的过程,暂且不表。

转载于:https://my.oschina.net/qiangzigege/blog/875117

你可能感兴趣的文章
RabbitMQ发送消息成功,但是接受不到消息
查看>>
nova-network创建初始化网络
查看>>
虎符遥控器(PPT遥控翻页)
查看>>
Java常用缩略词
查看>>
Java构造块,静态代码块,构造方法执行顺序
查看>>
3D打印开源切片软件Cura配置步骤
查看>>
c++读取TXT文件内容
查看>>
EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...
查看>>
[android] ndk环境的搭建
查看>>
Kafka集群搭建
查看>>
js表达式
查看>>
oracle的日期相减
查看>>
半正定矩阵
查看>>
C语言面试基本问题
查看>>
这不是一篇随笔
查看>>
vc写csv文件
查看>>
LaTeX 加粗
查看>>
Microsoft Dynamics CRM 2011 SDK 5.07版本已经发布
查看>>
Go使用Gob存储数据
查看>>
What Are You Talking About(字典树)
查看>>