Spring Boot 如果一个service @Transactional所在办法不是public会产生什么?(二)这篇文章里咱们晓得了,no-public 的帽子办法(其实办法就是@Transaction被润饰^_^)最终执行的实例并不是代理类,那么在什么时候代理类被替换掉的呢?

图1

刚开始执行时,的确是代理类~

图2

咱们剖析一下DynamicAdvisedInterceptor.intercept():

public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {            Object oldProxy = null;            boolean setProxyContext = false;            Object target = null;            TargetSource targetSource = this.advised.getTargetSource();            try {                if (this.advised.exposeProxy) {                    // Make invocation available if necessary.                    oldProxy = AopContext.setCurrentProxy(proxy);                    setProxyContext = true;                }                // Get as late as possible to minimize the time we "own" the target, in case it comes from a pool...                target = targetSource.getTarget();                Class<?> targetClass = (target != null ? target.getClass() : null);                List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);                Object retVal;                //这里判断指标办法是不是public                if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {                    // We can skip creating a MethodInvocation: just invoke the target directly.                    // Note that the final invoker must be an InvokerInterceptor, so we know                    // it does nothing but a reflective operation on the target, and no hot                    // swapping or fancy proxying.                    Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args);                    retVal = methodProxy.invoke(target, argsToUse);                }                else {                    // 因为不是public,须要执行这里                    retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();                }                retVal = processReturnType(proxy, target, method, retVal);                return retVal;            }            finally {                if (target != null && !targetSource.isStatic()) {                    targetSource.releaseTarget(target);                }                if (setProxyContext) {                    // Restore old proxy.                    AopContext.setCurrentProxy(oldProxy);                }            }        }

最终调CglibAopProxy.invokeJoinpoint();
图3

@Override        protected Object invokeJoinpoint() throws Throwable {            //因为咱们的办法不是public            if (this.publicMethod) {                return this.methodProxy.invoke(this.target, this.arguments);            }            else {                //所有执行这里的逻辑                return super.invokeJoinpoint();            }        }

其实就是ReflectiveMethodInvocation.invokeJoinpoint();

protected Object invokeJoinpoint() throws Throwable {        //        return AopUtils.invokeJoinpointUsingReflection(this.target, this.method, this.arguments);    }

上面是target,method,arguments具体的值:

AopUtils.invokeJoinpointUsingReflection()的外围逻辑是method.invoke(target, args),这样一来就通过非代理类,来进行调用了!