上次分析了properties標籤的載入過程,今天繼續分析下面的過程
private void parseconfiguration(xnode root) catch (exception e)
}
具體跟蹤到這 org.apache.ibatis.builder.xml.xmlconfigbuilder.settingsasproperties(xnode)
private properties settingsasproperties(xnode context)
properties props = context.getchildrenasproperties();
// 1.分析一
metaclass metaconfig = metaclass.forclass(configuration.class, localreflecto***ctory);
for (object key : props.keyset())
}return props;
}
分析 一
**跟蹤到這 org.apache.ibatis.reflection.reflector.reflector(class<?>)
public reflector(class<?> clazz)
for (string propname : writeablepropertynames)
}
分析 1.1
將本地的無參構造方法當成是預設構造方法
分析 1.2
private void addgetmethods(class<?> cls)
string name = method.getname();
if ((name.startswith("get") && name.length() > 3)
|| (name.startswith("is") && name.length() > 2))
}resolvegetterconflicts(conflictinggetters);
}
主要是解決get方法衝突問題
private void resolvegetterconflicts(map> conflictinggetters)
class<?> winnertype = winner.getreturntype();
class<?> candidatetype = candidate.getreturntype();
if (candidatetype.equals(winnertype)) else if (candidate.getname().startswith("is"))
} else if (candidatetype.isassignablefrom(winnertype)) else if (winnertype.isassignablefrom(candidatetype)) else
}//選出最優匹配的加入到方法中
addgetmethod(propname, winner);
}}
分析1.3 set方法與get類似
分析 1.4
private void addfields(class<?> clazz) catch (exception e)
}if (field.isaccessible())
}if (!getmethods.containskey(field.getname())) }}
//遞迴查到父類的屬性
if (clazz.getsuperclass() != null)
}
分析二
public boolean hassetter(string name) else
} else
}
public propertytokenizer(string fullname) else
indexedname = name;
delim = name.indexof('[');
if (delim > -1)
}
總結:所有settings配置檔案中的鍵在configuration中都有相應的set方法 Mybatis 原始碼分析
mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...
Mybatis原始碼分析
我們都知道mybatis它是一款優秀的持久層框架,它支援定製化sql 儲存過程以及高階對映,幫我們節省了許多時間與精力,今天我們主要來對mybatis的底層原始碼進行分析,主要是以下4行 首先呼叫resources中的單個string引數的getresuorceasstream string res...
MyBatis 原始碼分析
sqlsession inte ce,代表乙個連線資料庫的會話,提供了乙個預設的 defaultsqlsession sqlsessionfactory inte ct,建立 sqlsessionfactory 的工廠,提供了預設的 defaultsqlsessionfactory建立 defaul...