返回值类型处理器初始化流程

在实例化org.apache.ibatis.session.Configuration对象的时间会触发TypeHandlerRegistry实例化,然后在TypeHandlerRegistry的构造方法里面会调用register方法进行注册各种的handler处理器

ü 注册

public final class TypeHandlerRegistry {
//typeHandler为当前自定义类型处理器
public void register(TypeHandler typeHandler) {
boolean mappedTypeFound = false;
//mappedTypes即String
MappedTypes mappedTypes = typeHandler.getClass().getAnnotation(MappedTypes.class);
if (mappedTypes != null) {
for (Class<?> handledType : mappedTypes.value()) {
register(handledType, typeHandler);
}
}
}
}
public final class TypeHandlerRegistry {
private void register(Type javaType, TypeHandler<? extends T> typeHandler) {
//JDBC的类型,即TIMESTAMP
MappedJdbcTypes mappedJdbcTypes = typeHandler.getClass().
getAnnotation(MappedJdbcTypes.class);
if (mappedJdbcTypes != null) {
for (JdbcType handledJdbcType : mappedJdbcTypes.value()) {
//TYPE_HANDLER_MAP是Java类型中的默认处理器。
//以String为例,它默认可以处理VARCHAR、CHAR、NVARCHAR、CLOB、NCLOB、NULL
Map> map = TYPE_HANDLER_MAP.get(javaType);
//给String添加一种处理器为typeHandler
map.put(jdbcType, typeHandler);
//注册处理器实例
ALL_TYPE_HANDLERS_MAP.put(typeHandler.getClass(), typeHandler);
}
}
}
}


ü 调用
注册完毕之后,它在什么地方生效呢?关键在于能否可以找到这个处理器。看完上面的注册过程,查找其实很简单。先从TYPE_HANDLER_MAP根据JavaType,获取String类型的全部处理器,再从中过滤出JDBC类型为TIMESTAMP的即可。

private TypeHandler getTypeHandler(Type type, JdbcType jdbcType) {
//根据JavaType获取String类型的全部处理器
Map> jdbcHandlerMap = getJdbcHandlerMap(type);
TypeHandler<?> handler = null;
if (jdbcHandlerMap != null) {
//再根据jdbcType获取到TIMESTAMP的处理器
handler = jdbcHandlerMap.get(jdbcType);
}
return (TypeHandler) handler;
}