mybatis annotaion方式并不像spring,需要指定annotation-driven来启用annotaion特性。
mybatis默认支持annotation,参考MapperRegistry#addMapper
/**
* MapperRegistry Configuration实现annotaion mapper注册的帮助类
**/
public <T> void addMapper(Class<T> type) {
if (type.isInterface()) {
try {
MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);
parser.parse();
} finally {
//...
}
}
}
接下来就是对Method对象的parse,解析出完整的mapped-statement 配置
public void parse() {
// Class级别解析
parseCache();
parseCacheRef();
Method[] methods = type.getMethods();
// Method级别解析
for (Method method : methods) {
try {
// 根据Annotation解析完整的MappedStatement信息
parseStatement(method);
} catch (IncompleteElementException e) {
// 加入待处理队列
configuration.addIncompleteMethod(new MethodResolver(this, method));
}
}
// 再次尝试解析 IncompleteMethod
parsePendingMethods();
}
最后,将解析完的mapped-statement 归入configuration
MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlSource, sqlCommandType);
// ......
MappedStatement statement = statementBuilder.build();
configuration.addMappedStatement(statement);
附:mybatis Mapper XML 解析顺序
- 循环指定的mapperLocations,创建对应XMLMapperBuilder
- 解析mapper node,addMappedStatement
- guess xml namespace(Class),引入Annotation处理流程
- 创建MapperAnnotationBuilder
- 解析 Class.method annotation,addMappedStatement
- ……