编者按:
- 基于mabatis3.0.1
- 尝试从架构和产品设计维度重读一点代码
- git version hash:
d929486dc250f1b9e6cf45720e59456ed8d6478b
xml配置型的配置和Mapper.xml加载
加载栈

image.png
注解型的配置和Mapper加载
1. xml和注解配置的读取优先顺序
xml配置优先
MapperAnnotationBuilder.java
public void parse() {
String resource = type.toString();
if (!configuration.isResourceLoaded(resource)) {
configuration.addLoadedResource(resource);
//优先调用了xml配置解析
loadXmlResource();
assistant.setCurrentNamespace(type.getName());
parseCache();
parseCacheRef();
Method[] methods = type.getMethods();
for (Method method : methods) {
parseResultsAndConstructorArgs(method);
parseStatement(method);
}
}
}
private void loadXmlResource() {
String xmlResource = type.getName().replace('.', '/') + ".xml";
Reader xmlReader = null;
try {
xmlReader = Resources.getResourceAsReader(type.getClassLoader(), xmlResource);
} catch (IOException e) {
// ignore, resource is not required
}
if (xmlReader != null) {
XMLMapperBuilder xmlParser = new XMLMapperBuilder(xmlReader, assistant.getConfiguration(), xmlResource, sqlFragments, type.getName());
xmlParser.parse();
}
}
2. 配置缓存key的生成
结果如: org.mybatis.example.BlogMapper.add-Blog
private String generateResultMapName(Method method) {
StringBuilder suffix = new StringBuilder();
for (Class c : method.getParameterTypes()) {
suffix.append("-");
suffix.append(c.getSimpleName());
}
if (suffix.length() < 1) {
suffix.append("-void");
}
return type.getName() + "." + method.getName() + suffix;
}
//id = applyCurrentNamespace(id);
public String applyCurrentNamespace(String base) {
if (base == null) return null;
if (base.contains(".")) return base;
return currentNamespace + "." + base;
}
3. 做成只读型
Collections.unmodifiableXXX
// lock down collections
resultMap.resultMappings = Collections.unmodifiableList(resultMap.resultMappings);
resultMap.idResultMappings = Collections.unmodifiableList(resultMap.idResultMappings);
resultMap.constructorResultMappings = Collections.unmodifiableList(resultMap.constructorResultMappings);
resultMap.propertyResultMappings = Collections.unmodifiableList(resultMap.propertyResultMappings);
resultMap.mappedColumns = Collections.unmodifiableSet(resultMap.mappedColumns);
Resources工具类
package org.apache.ibatis.io;
/**
* A class to simplify access to resources through the classloader.
*/
public class Resources {
-
挺多实用方法
image.png
