mybatis原始碼分析(2)

2021-09-25 01:30:32 字數 2208 閱讀 9021

上次分析了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...