返回值类型处理器初始化流程
在实例化org.apache.ibatis.session.Configuration对象的时间会触发TypeHandlerRegistry实例化,然后在TypeHandlerRegistry的构造方法里面会调用register方法进行注册各种的handler处理器
ü 注册
public final class TypeHandlerRegistry { //typeHandler为当前自定义类型处理器 public 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 //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 //给String添加一种处理器为typeHandler map.put(jdbcType, typeHandler); //注册处理器实例 ALL_TYPE_HANDLERS_MAP.put(typeHandler.getClass(), typeHandler); } } } } |
---|
ü 调用
注册完毕之后,它在什么地方生效呢?关键在于能否可以找到这个处理器。看完上面的注册过程,查找其实很简单。先从TYPE_HANDLER_MAP根据JavaType,获取String类型的全部处理器,再从中过滤出JDBC类型为TIMESTAMP的即可。
private //根据JavaType获取String类型的全部处理器 Map TypeHandler<?> handler = null; if (jdbcHandlerMap != null) { //再根据jdbcType获取到TIMESTAMP的处理器 handler = jdbcHandlerMap.get(jdbcType); } return (TypeHandler } |
---|