ibatis学习源码学习(一):类信息的缓存

Ibatis数据转化时,需要根据配置的信息(或按照约定)将查询返回的值映射到实例对象上。这时候需要用到反射机制,将对应的属性赋上对应的值。

Ibatis的思路是:建一个缓存(CLASS_INFO_MAP),每次反射时先再缓存里面找,如果有,则返回缓存的信息,如果没有,再利用反射机制,将反射得到的类的信息缓存起来,然后返回类的信息。因为反射本身涉及到效率问题,如果每个实例都进行反射,将大大降低框架的效率,所以采用了缓存的机制。这种思路给我们平时想通过反射设置或得到属性值的程序提供了很好的解决方案。

具体的实现类参考Ibatis源码里面的:com.ibatis.common.beans.ClassInfo

其中关键的方法有两个,第一个:

/**
   * Gets an instance of ClassInfo for the specified class.
   *
   * @param clazz The class for which to lookup the method cache.
   * @return The method cache for the class
   */
  public static ClassInfo getInstance(Class clazz) {
    if (cacheEnabled) {
      synchronized (clazz) {
        ClassInfo cached = (ClassInfo) CLASS_INFO_MAP.get(clazz);
        if (cached == null) {
          cached = new ClassInfo(clazz);
          CLASS_INFO_MAP.put(clazz, cached);
        }
        return cached;
      }
    } else {
      return new ClassInfo(clazz);
    }
  }
 

第二个:

private ClassInfo(Class clazz) {
    className = clazz.getName();
    addDefaultConstructor(clazz);
    addGetMethods(clazz);
    addSetMethods(clazz);
    addFields(clazz);
    readablePropertyNames = (String[]) getMethods.keySet().toArray(new String[getMethods.keySet().size()]);
    writeablePropertyNames = (String[]) setMethods.keySet().toArray(new String[setMethods.keySet().size()]);
  }
 

相关推荐