1. 程式人生 > >MyBatis延遲載入

MyBatis延遲載入

  • @throws Throwable
    */
    @Override
    public Object invoke(Object enhanced, Method method, Method methodProxy, Object[] args) throws Throwable {
    final String methodName = method.getName();
    try {
    synchronized (lazyLoader) {
    if (WRITE_REPLACE_METHOD.equals(methodName)) {
    //忽略暫未找到具體作用
    Object original;
    if (constructorArgTypes.isEmpty()) {
    original = objectFactory.create(type);
    } else {
    original = objectFactory.create(type, constructorArgTypes, constructorArgs);
    }
    PropertyCopier.copyBeanProperties(type, enhanced, original);
    if (lazyLoader.size() > 0) {
    return new JavassistSerialStateHolder(original, lazyLoader.getProperties(), objectFactory, constructorArgTypes, constructorArgs);
    } else {
    return original;
    }
    } else {
    //延遲載入數量大於0
    if (lazyLoader.size() > 0 && !FINALIZE_METHOD.equals(methodName)) {
    //aggressive 一次載入性所有需要要延遲載入屬性或者包含觸發延遲載入方法
    if (aggressive || lazyLoadTriggerMethods.contains(methodName)) {
    log.debug("==> laze lod trigger method:" + methodName + “,proxy method:” + methodProxy.getName() + " class:" + enhanced.getClass());
    //一次全部載入
    lazyLoader.loadAll();
    } else if (PropertyNamer.isSetter(methodName)) {
    //判斷是否為set方法,set方法不需要延遲載入
    final String property = PropertyNamer.methodToProperty(methodName);
    lazyLoader.remove(property);
    } else if (PropertyNamer.isGetter(methodName)) {
    final String property = PropertyNamer.methodToProperty(methodName);
    if (lazyLoader.hasLoader(property)) {
    //延遲載入單個屬性
    lazyLoader.load(property);
    log.debug(“load one :” + methodName);
    }
    }
    }
    }
    }
    return methodProxy.invoke(enhanced, args);
    } catch (Throwable t) {
    throw ExceptionUtil.unwrapThrowable(t);
    }
    }
    }