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),这样一来就通过非代理类,来进行调用了!